ตอนต้องใช้ if / elsif statements ลองพิจารณา Ruby case statement แทน ในโพสต์นี้เรียนรู้ use cases ต่างๆ และกลไกภายใต้

Note: ในภาษาอื่นเรียกว่า switch statement
Components ของ case statement ใน Ruby:
| Keyword | คำอธิบาย |
|---|---|
| case | เริ่ม case statement definition รับ variable ที่จะทำงาน |
| when | เงื่อนไขที่ match ได้แต่ละอันคือ when statement |
| else | ถ้าไม่มีอะไร match ทำนี้ Optional |
Ruby Case และ Ranges
case statement ยืดหยุ่นกว่าที่คิด ตัวอย่าง: พิมพ์ข้อความตาม range ที่ value อยู่
case capacity
when 0
"You ran out of gas."
when 1..20
"The tank is almost empty. Quickly, find a gas station!"
when 21..70
"You should be ok for now."
when 71..100
"The tank is almost full."
else
"Error: capacity has an invalid value (#{capacity})"
end
โค้ดนี้ elegant กว่า if / elsif version มาก
Ruby Case และ Regex
ใช้ regular expressions เป็น when condition ได้ ตัวอย่าง: serial_code มีตัวอักษรแรกบอก risk level
case serial_code when /\AC/ "Low risk" when /\AL/ "Medium risk" when /\AX/ "High risk" else "Unknown risk" end
เมื่อไม่ควรใช้ Ruby Case
ตอนมี simple 1:1 mapping อาจอยากทำแบบนี้:
case country when "europe" "https://eu.example.com" when "america" "https://us.example.com" end
แต่ผมคิดว่าแบบนี้ดีกว่า:
SITES = {
"europe" => "https://eu.example.com",
"america" => "https://us.example.com"
}
SITES[country]
Hash solution efficient และจัดการง่ายกว่า ไม่คิดไหม?
Case ทำงานอย่างไร: เมธอด ===
เคยสงสัย case ทำงานภายในอย่างไร? กลับไปตัวอย่างแรก นี่คือสิ่งที่เกิดขึ้น:
(1..20) === capacity (21..70) === capacity (71..100) === capacity
เห็นไหม condition reversed เพราะ Ruby เรียก === บน object ด้านซ้าย === แค่เมธอดที่ class ใดๆ implement ได้ ในกรณีนี้ Range implement โดยคืน true ก็ต่อเมื่อ value อยู่ใน range
=== implementation ใน Rubinius (สำหรับ Range class):
def ===(value) include?(value) end
Source: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178
Procs + Case
Class อื่นน่าสนใจที่ implement === คือ Proc class
Related post: เรียนรู้ procs และ lambdas เพิ่มเติม
ตัวอย่าง: define 2 procs หนึ่งเช็ก even อีกอัน odd
odd = proc(&:odd?) even = proc(&:even?) case number when odd puts "Odd number" when even puts "Even number" end
สิ่งที่เกิดขึ้นจริง:
odd.===(number) even.===(number)
ใช้ === บน proc เทียบเท่า call
สรุป
เรียนรู้ Ruby case statement ทำงานอย่างไร และยืดหยุ่นแค่ไหน ต่อไปคุณลองใช้ในโปรเจกต์ของตัวเอง!
หวังว่าจะมีประโยชน์! แชร์โพสต์นี้ให้คนอื่นเรียนรู้ด้วย 🙂