Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby Case Statements: การใช้งานหลากหลายและตัวอย่างปฏิบัติ

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

เชี่ยวชาญ Ruby Case Statements: การใช้งานหลากหลายและตัวอย่างปฏิบัติ

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 ทำงานอย่างไร และยืดหยุ่นแค่ไหน ต่อไปคุณลองใช้ในโปรเจกต์ของตัวเอง!

หวังว่าจะมีประโยชน์! แชร์โพสต์นี้ให้คนอื่นเรียนรู้ด้วย 🙂