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