2013-05-21 6 views
7

Ich erinnere mich an etwas über procs in case Aussagen in Ruby 2.0 erlaubt, aber ich kann es nicht googeln.Kann Procs mit Case-Anweisungen in Ruby 2.0 verwendet werden?

Ich versuchte, Ruby 2.0.0 NEWS und How to write a switch statement in Ruby zu überprüfen. Ich besuchte auch http://ruby-doc.org, aber der Link, den es für Schlüsselwörter hatte, war für Ruby 1.9, nicht Ruby 2.0.

Sind Procs in Fallanweisungen zulässig?

+0

Ich dachte, es war von vor. – sawa

Antwort

19

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

'l' sieht auf Stack Overflow sehr ähnlich wie' 1' aus. Ich habe mich eine Minute lang gefragt, ob George Orwell die Leitung der Mathematikabteilung übernommen hatte! (PS: gibt es Dokumentation zur Verwendung von Procs in einer case-Anweisung?) –

+0

Ich bin mit den 1.9.1-Dokumenten verbunden, aber es scheint, dass alle modernen Versionen der Dokumentation keine richtige Überschrift für die Methode bereitstellen, was sie sehr verwirrend macht . Ich werde die Frage mit der Dokumentation zu ProC# === bearbeiten. – Phrogz

+1

Danke, phroggie, für die Auffrischung der 'ProC# ===' für mich. –

Verwandte Themen