Computer >> Máy Tính >  >> Lập trình >> Ruby

Tuyên bố trường hợp rubys - kỹ thuật nâng cao

Không có gì có thể đơn giản và nhàm chán hơn tuyên bố tình huống. Đó là một phần giữ lại từ C. Bạn sử dụng nó để thay thế một loạt các ifs. Trường hợp đóng cửa. Hay là nó?

Trên thực tế, các câu lệnh tình huống trong Ruby rất phong phú và phức tạp hơn bạn tưởng tượng. Hãy xem chỉ một ví dụ:

case "Hi there"
when String
  puts "case statements match class"
end

# outputs: "case statements match class"

Ví dụ này cho thấy rằng các câu lệnh trường hợp không chỉ khớp với giá trị của một mặt hàng mà còn cả đẳng cấp của nó . Điều này có thể thực hiện được vì bên dưới, Ruby sử dụng === toán tử, hay còn gọi là. toán tử ba dấu bằng.

Tham quan nhanh === toán tử

Khi bạn viết x === y y trong Ruby, bạn đang hỏi "y có thuộc nhóm được đại diện bởi x không?" Đây là một tuyên bố rất chung chung. Các chi tiết cụ thể khác nhau, tùy thuộc vào loại nhóm bạn đang làm việc.

# Here, the Class.===(item) method is called, which returns true if item is an instance of the class 

String === "hello" # true
String === 1 # false


Các chuỗi, biểu thức chính quy và phạm vi đều xác định ===(item) của riêng chúng các phương thức này hoạt động ít nhiều như bạn mong đợi. Bạn thậm chí có thể thêm phương thức ba bằng vào các lớp của riêng mình.

Bây giờ chúng ta đã biết điều này, chúng ta có thể thực hiện tất cả các thủ thuật với trường hợp.

Đối sánh các dải ô trong câu lệnh chữ hoa

Bạn có thể sử dụng phạm vi trong các câu lệnh chữ hoa chữ thường nhờ vào thực tế là range === n chỉ cần trả về giá trị của range.include?(n) . Làm thế nào tôi có thể chắc chắn như vậy? Nó có trong tài liệu.

case 5
when (1..10)
  puts "case statements match inclusion in a range"
end

# outputs "case statements match inclusion in a range"

Khớp biểu thức chính quy với câu lệnh viết hoa

Cũng có thể sử dụng regexes trong câu lệnh trường hợp vì /regexp/ === "string" chỉ trả về true nếu chuỗi khớp với biểu thức chính quy. Tài liệu cho Regexp giải thích điều này.

case "FOOBAR"
when /BAR$/
  puts "they can match regular expressions!"
end

# outputs "they can match regular expressions!"

Đối sánh procs và lambdas

Đây là một trong những loại kỳ lạ. Khi bạn sử dụng Proc#===(item) , nó cũng giống như thực hiện Proc#call(item) . Đây là tài liệu cho nó. Điều này có nghĩa là bạn có thể sử dụng lambdas và procs trong câu lệnh trường hợp của mình làm đối sánh động.

case 40
when -> (n) { n.to_s == "40" }
  puts "lambdas!"
end

# outputs "lambdas"

Viết các lớp đối sánh của riêng bạn

Như tôi đã đề cập ở trên, việc thêm hành vi trường hợp tùy chỉnh vào các lớp của bạn cũng đơn giản như xác định === của riêng bạn phương pháp. Một cách sử dụng cho điều này có thể là rút logic điều kiện phức tạp thành nhiều lớp nhỏ. Tôi đã phác thảo cách nó có thể hoạt động trong ví dụ dưới đây:

class Success
  def self.===(item)
    item.status >= 200 && item.status < 300
  end
end

class Empty
  def self.===(item)
    item.response_size == 0
  end
end

case http_response
when Empty
  puts "response was empty"
when Success
  puts "response was a success"
end