Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Làm Chủ Câu Lệnh Case Ruby: Sử Dụng Linh Hoạt & Ví Dụ Thực Tế

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àm Chủ Câu Lệnh Case Ruby: Sử Dụng Linh Hoạt & Ví Dụ Thực Tế

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óaMô tả
caseBắt đầu định nghĩa case. Nhận biến sẽ làm việc.
whenMỗi điều kiện khớp là một when statement.
elseNế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! 🙂