Sì.
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
Tuttavia, questo non è diverso da 1.9.1 dal Proc#===
stato definito allora. Dal momento che ruby-docs sembra avere un problema che mostra questo metodo, per essere chiari la documentazione dice che proc === obj
:
invoca il blocco con obj
come parametro del proc come #call
. Consentire a un oggetto proc di essere un obiettivo della clausola when
in un'istruzione case
.
Per il principiante Ruby, poi when
clausola nel case
dichiarazioni di Ruby assume il valore nella clausola e chiama il metodo ===
su di essa, passando l'argomento per l'istruzione case. Così, per esempio, questo codice ...
case "cats"
when /^cat/ then puts("line starts with cat!")
when /^dog/ then puts("line starts with dog!")
end
... corre /^cat/ === "cats"
per decidere se si tratta di una partita; la classe RegExp
definisce il metodo ===
per eseguire la corrispondenza delle espressioni regolari. Pertanto, è possibile utilizzare il proprio oggetto in una clausola when
finché si definisce ===
per esso.
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!
Ho pensato che fosse da prima. – sawa