2013-05-21 15 views

Odpowiedz

19

Tak.

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 

Jednakże, nie jest to inaczej niż 1.9.1 od Proc#=== zdefiniowano wtedy. Ponieważ ruby-docs wydaje się mieć problem pokazując tę ​​metodę, aby być jasne dokumentacja mówi, że proc === obj:

Wywołuje blok z obj jako parametr PROC, niczym #call. Umożliwia to, aby obiekt proc był celem klauzuli when w instrukcji case.


Dla początkujących Ruby, następnie when klauzula w Ruby case sprawozdania przyjmuje wartość w klauzuli i wywołuje metodę === na nim, przekazując argument instrukcji case. Tak więc, na przykład, ten kod ...

case "cats" 
    when /^cat/ then puts("line starts with cat!") 
    when /^dog/ then puts("line starts with dog!") 
end 

... biegnie /^cat/ === "cats" zdecydować, czy jest to mecz; klasa RegExp definiuje metodę === w celu dopasowania do wyrażenia regularnego. Dlatego możesz używać własnego obiektu w klauzuli when, o ile zdefiniujesz dla niego ===.

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' wygląda okropnie podobnie do' 1' na przepełnieniu stosu. Zastanawiałem się przez chwilę, czy George Orwell został przydzielony do działu matematyki! (PS: czy istnieje jakakolwiek dokumentacja na temat używania proców w opisie sprawy?) –

+0

Dołączyłem do dokumentów 1.9.1, ale wydaje się, że wszystkie współczesne wersje dokumentów nie dostarczają odpowiedniego nagłówka dla tej metody, co sprawia, że ​​jest bardzo mylące . Będę edytować pytanie z dokumentacją na 'ProC# ==='. – Phrogz

+1

Dzięki, phroggie, za odświeżenie tego "ProC# ===" dla mnie. –