เมื่อใดก็ตามที่คุณต้องการใช้ if / elsif คำสั่งที่คุณสามารถพิจารณาใช้คำสั่งกรณี Ruby แทน ในโพสต์นี้ คุณจะได้เรียนรู้กรณีการใช้งานที่แตกต่างกันสองสามกรณีและวิธีการทำงานทั้งหมดภายใต้ประทุน

หมายเหตุ:ในภาษาการเขียนโปรแกรมอื่นๆ เรียกว่า สวิตช์ คำสั่ง
ส่วนประกอบของคำสั่ง case ใน Ruby:
| คำหลัก | คำอธิบาย |
|---|---|
| เคส | เริ่มนิยามคำสั่ง case รับตัวแปรที่คุณจะใช้งาน |
| เมื่อ | ทุกเงื่อนไขที่สามารถจับคู่ได้คือเงื่อนไขหนึ่งเมื่อคำสั่ง |
| อื่น | ถ้าไม่มีอะไรตรงกัน ให้ทำดังนี้ ไม่บังคับ |
ทับทิม Case &Ranges
case คำสั่งมีความยืดหยุ่นมากกว่าที่จะปรากฏตั้งแต่แรกเห็น มาดูตัวอย่างกันว่าเราต้องการพิมพ์ข้อความโดยขึ้นอยู่กับช่วงของค่า
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
ฉันคิดว่าโค้ดนี้ค่อนข้างสวยเมื่อเทียบกับ if / elsif เวอร์ชั่นก็จะหน้าตาประมาณนี้
Ruby Case &Regex
คุณยังสามารถใช้นิพจน์ทั่วไปเป็น when สภาพ. ในตัวอย่างต่อไปนี้ เรามี serial_code ด้วยตัวอักษรเริ่มต้นที่บอกเราว่าผลิตภัณฑ์นี้มีความเสี่ยงต่อการบริโภคเพียงใด
case serial_code when /\AC/ "Low risk" when /\AL/ "Medium risk" when /\AX/ "High risk" else "Unknown risk" end
เมื่อใดที่ไม่ควรใช้ Ruby Case
เมื่อคุณมีการทำแผนที่ 1:1 อย่างง่าย คุณอาจถูกล่อลวงให้ทำสิ่งนี้
case country when "europe" "http://eu.example.com" when "america" "http://us.example.com" end
ในความคิดของฉัน ควรทำสิ่งนี้แทน:
SITES = {
"europe" => "http://eu.example.com",
"america" => "http://us.example.com"
}
SITES[country]
โซลูชันแฮชมีประสิทธิภาพและใช้งานได้ง่ายกว่า คิดไม่ถึง?
กรณีทำงานอย่างไร:วิธี ===
คุณอาจสงสัยว่า case ทำงานภายใต้ประทุน หากเราย้อนกลับไปที่ตัวอย่างแรก นี่คือสิ่งที่เกิดขึ้น:
(1..20) === capacity (21..70) === capacity (71..100) === capacity
อย่างที่คุณเห็น เงื่อนไขกลับกันเพราะ Ruby เรียก === บนวัตถุทางด้านซ้าย === เป็นเพียงวิธีการที่สามารถนำมาใช้โดยชั้นเรียนใดก็ได้ ในกรณีนี้ Range ใช้เมธอดนี้โดยคืนค่า true เฉพาะเมื่อพบค่าภายในช่วงเท่านั้น
นี่คือวิธีที่ === ถูกนำมาใช้ใน Rubinius (สำหรับ Range คลาส):
def ===(value) include?(value) end
ที่มา:https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178
Procs + Case
อีกคลาสที่น่าสนใจที่ใช้ === คือ Proc ชั้นเรียน
โพสต์ที่เกี่ยวข้อง :เรียนรู้เพิ่มเติมเกี่ยวกับ procs &lambdas
ในตัวอย่างนี้ ฉันกำหนด 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 ทำงานอย่างไรและมีความยืดหยุ่นเพียงใด ตอนนี้ถึงตาคุณแล้วที่จะเริ่มใช้ประโยชน์จากมันให้ดีที่สุดในโครงการของคุณเอง
ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์!
โปรดแชร์โพสต์นี้เพื่อให้ผู้คนได้เรียนรู้มากขึ้น! 🙂