Keywords อย่าง next และ break เป็นส่วนหนึ่งของภาษา Ruby — ถ้าอยากเข้าใจ Ruby ลึก ต้องรู้ว่ามันทำงานยังไง
ใช้ทำอะไร?
ใน Ruby มี Loops หลายแบบ — เช่น: while, until, each
ตอนเขียน Loop อาจอยากข้ามรอบ (iteration) หรือ หยุด Loop ก่อนเวลา — นั่นคือที่มาของ next และ break!
มาดูวิธีใช้กัน
Ruby Next Keyword (ข้ามรอบ)
next ใช้ข้าม 1 รอบ (iteration)
ตัวอย่าง: นับสตริง — ไม่อยากนับสตริงที่ยาว 4 ตัวอักษร
เขียนได้แบบนี้:
strings = ["one", "two", "four", "five"] strings.inject(0) do |sum, str| next if str.size == 4 sum + str.size end # nil
โค้ดนี้ ไม่ทำงาน — ได้ nil
ทำไม? next คืน nil โดย Default (เหมือน return ไม่มีค่า) — inject นำค่าสุดท้ายของ Block ไปเป็น Argument ถัดไป sum กลายเป็น nil
แก้ได้ยังไง? เปลี่ยนบรรทัด next เป็น:
next sum if str.size == 4
ทำให้ next คืนค่า sum
ถ้า Performance ไม่ใช่ Priority สูงสุด (มักไม่ใช่) — กรอง Array ก่อนดีกว่า ไม่ต้องใช้ next
หรือดีกว่านี้:
strings = ["one", "two", "four", "five"]
strings.inject(0) { |sum, str| str.size == 4 ? sum : sum + str.size }
# 6
นี่คือ Ternary Operator — Ruby ให้เครื่องมือพอที่หลีกเลี่ยง next ใช้สิ!
Ruby Break Keyword (ออกจาก Loop ก่อนเวลา)
break คล้าย next แต่จบ Loop และคืนค่า แทนที่จะข้ามแค่ 1 รอบ
ใช้ Early return จาก Loop ได้
ทำไมไม่ใช้
return? เพราะมันจะออกจาก Method ทั้งหมด ไม่ใช่แค่ Loop
หรือจบ Unconditional Loop
เช่นนี้:
count = 0 loop do break if count == 10 puts count count += 1 end
พิมพ์ตัวเลข 0 ถึง 9 — แต่ทางเลือกดีกว่าคือ times, upto, หรือ Range + each
ตัวอย่าง:
0.upto(9).each(&method(:puts))
&method(:puts) คือ Shortcut เรียก puts ทุกตัวเลข
หลีกเลี่ยงความสับสน: Next เป็น Ruby Method ด้วย
เพราะ Keyword ไหนไม่ได้หมายความว่าจะไม่ได้เป็น Method Name
คลาสบางตัว Implement next เป็นเมธอด — เช่น String และ Integer
ตัวอย่าง:
1.next # 2
ผลลัพธ์ไม่แปลกหรอก
ลองนี้:
"zz".next # "aaa"
น่าสนใจกว่า!
ทำงานยังไง? ทุกคลาส Implement next เอง — Logic สำหรับค่าถัดไป
Integer: แค่ +1 — String: เพิ่มตัวอักษรสุดท้าย 1 ตัว (อักษรถัดไป / +1 สำหรับตัวเลข) ถ้ามี Carryover (9 -> 0, z -> a) จะเพิ่มตัวอักษรข้างซ้าย
Summary (สรุป)
คุณเรียนรู้ next และ break ใน Ruby แล้ว — ช่วยข้ามรอบ หรือ หยุด Loop ก่อนเวลา
ตอนนี้ถึงคุณฝึกทักษะ Ruby 🙂
ขอบคุณที่อ่านครับ!