Có.
2.0.0p0 :001> lamb = ->(x){ x%2==1 }
#=> #<Proc:[email protected](irb):1 (lambda)>
2.0.0p0 :002> case 3; when lamb then p(:yay); end
:yay
#=> :yay
2.0.0p0 :003> lamb === 3
#=> true
2.0.0p0 :007> lamb === 2
#=> false
Tuy nhiên, điều này không khác với 1.9.1 từ Proc#===
được xác định trở lại sau đó. Kể từ ruby-docs dường như có một vấn đề cho thấy phương pháp này, để được rõ ràng các tài liệu nói rằng proc === obj
:
gọi các khối với obj
như tham số của proc như #call
. Nó là để cho phép một đối tượng proc là một mục tiêu của khoản when
trong một tuyên bố case
.
Đối với người mới bắt đầu Ruby, sau đó when
điều khoản trong case
báo cáo Ruby mất giá trị trong mệnh đề và gọi phương thức ===
vào nó, đi qua trong đối số để báo cáo trường hợp. Vì vậy, ví dụ: mã này…
case "cats"
when /^cat/ then puts("line starts with cat!")
when /^dog/ then puts("line starts with dog!")
end
… chạy /^cat/ === "cats"
để quyết định xem đó có phù hợp hay không; lớp RegExp
xác định phương thức ===
để thực hiện đối sánh regex. Do đó, bạn có thể sử dụng đối tượng của riêng mình trong mệnh đề when
miễn là bạn xác định ===
cho nó.
Moddable = Struct.new(:n) do
def ===(numeric)
numeric % n == 0
end
end
mod4 = Moddable.new(4)
mod3 = Moddable.new(3)
12.times do |i|
case i
when mod4
puts "#{i} is a multiple of 4!"
when mod3
puts "#{i} is a multiple of 3!"
end
end
#=> 0 is a multiple of 4!
#=> 3 is a multiple of 3!
#=> 4 is a multiple of 4!
#=> 6 is a multiple of 3!
#=> 8 is a multiple of 4!
#=> 9 is a multiple of 3!
Tôi nghĩ đó là từ trước. – sawa