2013-05-21 34 views
7

Tôi nhớ điều gì đó về procs được cho phép trong câu lệnh case trong Ruby 2.0, nhưng tôi không thể google nó.Procs có thể được sử dụng với các câu lệnh case trong Ruby 2.0 không?

Tôi đã thử kiểm tra Ruby 2.0.0 NEWSHow to write a switch statement in Ruby. Tôi cũng đã truy cập http://ruby-doc.org, nhưng liên kết mà nó có cho từ khóa là cho Ruby 1.9 chứ không phải Ruby 2.0.

Procs có được phép trong trường hợp câu lệnh không?

+0

Tôi nghĩ đó là từ trước. – sawa

Trả lời

19

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! 
+0

'l' trông rất giống với' 1' trên Stack Overflow. Tôi đã tự hỏi một phút nếu George Orwell đã được phụ trách bộ phận toán học! (PS: có tài liệu nào về việc sử dụng procs trong tuyên bố trường hợp không?) –

+0

Tôi liên kết với tài liệu 1.9.1, nhưng có vẻ như tất cả các phiên bản hiện đại của tài liệu đều không cung cấp tiêu đề phù hợp cho phương pháp, khiến nó rất khó hiểu . Tôi sẽ chỉnh sửa câu hỏi với tài liệu trên 'ProC# ==='. – Phrogz

+1

Cảm ơn, phroggie, vì đã làm mới rằng 'ProC# ===' đối với tôi. –

Các vấn đề liên quan