Khi cần dùng câu lệnh if / elsif có thể cân nhắc dùng câu lệnh case Ruby thay vào đó. Bài này học vài trường hợp dùng khác nhau và cách nó thực sự hoạt động bên dưới.

Lưu ý: Ngôn ngữ khác gọi đây là câu lệnh switch.
Thành phần câu lệnh case Ruby:
| Từ khóa | Mô tả |
|---|---|
| case | Bắt đầu định nghĩa case. Nhận biến sẽ làm việc. |
| when | Mỗi điều kiện khớp là một when statement. |
| else | Nếu không khớp gì thì làm này. Tùy chọn. |
Ruby Case & Ranges
Câu lệnh case linh hoạt hơn vẻ bề ngoài. Xem ví dụ in thông báo tùy thuộc range giá trị rơi vào.
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
Mình thấy code này thanh lịch so với phiên bản if / elsif.
Ruby Case & Regex
Cũng dùng biểu thức chính quy làm điều kiện when. Ví dụ sau có serial_code với chữ cái đầu cho biết rủi ro tiêu dùng sản phẩm.
case serial_code
when /\AC/
"Low risk"
when /\AL/
"Medium risk"
when /\AX/
"High risk"
else
"Unknown risk"
end
Khi Nào KHÔNG Dùng Ruby Case
Khi có ánh xạ 1:1 đơn giản, có thể cám dỗ làm thế này.
case country
when "europe"
"https://eu.example.com"
when "america"
"https://us.example.com"
end
Theo mình nên làm thế này:
SITES = {
"europe" => "https://eu.example.com",
"america" => "https://us.example.com"
}
SITES[country]
Giải pháp hash hiệu quả và dễ làm việc hơn. Bạn không nghĩ?
Case Hoạt Động Như Thế Nào: Phương Thức ===
Bạn có thắc mắc case hoạt động bên dưới như thế nào. Quay lại ví dụ đầu, đây là chuyện xảy ra:
(1..20) === capacity
(21..70) === capacity
(71..100) === capacity
Như thấy, điều kiện đảo ngược vì Ruby gọi === trên đối tượng bên trái. === chỉ là phương thức bất kỳ lớp nào triển khai. Ở đây, Range triển khai trả về true chỉ nếu giá trị tìm thấy trong range.
Cách === triển khai trong Rubinius (cho lớp Range):
def ===(value)
include?(value)
end
Nguồn: https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178
Procs + Case
Lớp thú vị khác triển khai === là Proc.
Bài liên quan: Tìm hiểu thêm procs & lambdas.
Ví dụ định nghĩa hai procs, một kiểm tra even, một odd.
odd = proc(&:odd?)
even = proc(&:even?)
case number
when odd
puts "Odd number"
when even
puts "Even number"
end
Đây là chuyện thực sự xảy ra:
odd.===(number)
even.===(number)
Dùng === trên proc có hiệu ứng giống call.
Kết Luận
Bạn đã học câu lệnh case Ruby hoạt động như thế nào và linh hoạt ra sao. Bây giờ đến lượt bạn dùng tốt nhất nó trong dự án riêng.
Hy vọng bài viết hữu ích!
Chia sẻ bài viết để nhiều người học được! 🙂