เมื่อใดก็ตามที่คุณต้องการใช้ 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" "https://eu.example.com" when "america" "https://us.example.com" end
ในความคิดของฉัน ควรทำสิ่งนี้แทน:
SITES = { "europe" => "https://eu.example.com", "america" => "https://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 ทำงานอย่างไรและมีความยืดหยุ่นเพียงใด ตอนนี้ถึงตาคุณแล้วที่จะเริ่มใช้ประโยชน์จากมันให้ดีที่สุดในโครงการของคุณเอง
ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์!
โปรดแชร์โพสต์นี้เพื่อให้ผู้คนได้เรียนรู้มากขึ้น! 🙂