2013-05-21 13 views

risposta

19

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

'l' sembra terribilmente simile a' 1' su Stack Overflow. Mi stavo chiedendo per un minuto se George Orwell fosse stato nominato responsabile del dipartimento di matematica! (PS: c'è qualche documentazione sull'utilizzo di proc in una dichiarazione di un caso?) –

+0

Ho collegato i documenti 1.9.1, ma sembra che tutte le versioni moderne dei documenti non riescano a fornire un'intestazione corretta per il metodo, il che rende molto confuso . Modificherò la domanda con la documentazione su 'ProC# ==='. – Phrogz

+1

Grazie, phroggie, per l'aggiornamento di "ProC# ===" per me. –

Problemi correlati