Ja.
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
Dies ist jedoch nicht anders als 1.9.1 seit Proc#===
dann definiert wurde zurück. Da rubin docs ein Problem darstellt, diese Methode zu haben scheint, klar zu sein, sagt die Dokumentation, dass proc === obj
:
den Block Startet mit obj
als der Parameter proc wie #call
. Es soll einem Proc-Objekt erlauben, ein Ziel von when
Klausel in einer case
-Anweisung zu sein.
Für den Anfänger Rubin, dann when
Klausel in case
Aussagen Ruby nimmt den Wert in der Klausel und ruft die ===
Methode auf sich, auf den Fall Aussage im Argumente übergeben. So zum Beispiel, dieser Code ...
case "cats"
when /^cat/ then puts("line starts with cat!")
when /^dog/ then puts("line starts with dog!")
end
... läuft /^cat/ === "cats"
zu entscheiden, ob es eine Übereinstimmung; Die Klasse RegExp
definiert die ===
-Methode zum Ausführen von Regex-Abgleich. Daher können Sie Ihr eigenes Objekt in einer when
-Klausel verwenden, solange Sie dafür ===
definieren.
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!
Ich dachte, es war von vor. – sawa