Natürlichere Art des Proc-Aufrufs in Ruby 1.9
Frage
Wie wir wissen, gibt es in Ruby 1.9 mehrere Möglichkeiten, Proc aufzurufen
f =->n {[:hello, n]}
p f[:ruby] # => [:hello, :ruby]
p f.call(:ruby) # => [:hello, :ruby]
p f.(:ruby) # => [:hello, :ruby]
p f === :ruby # => [:hello, :ruby]
Ich bin neugierig, was ist eine „natürlichere“ Art, Proc aufzurufen?„Natürlich“ bedeutet wahrscheinlich eher Informatik-ähnliche Art und Weise.
Lösung
Die zweite Option wird bei weitem am häufigsten verwendet.
p f.call(:ruby) # => [:hello, :ruby]
Dadurch ähnelt es eher einer Standardmethode.Außerdem verlassen sich einige Bibliotheken tatsächlich auf Duck-Typing, wenn sie Argumente validieren und die Verfügbarkeit prüfen #call
Methode.In diesem Fall mit #call
Stellt sicher, dass Sie ein Lambda oder jedes andere Objekt (einschließlich einer Klasse) bereitstellen können, auf das reagiert wird #call
.
Rack
Middlewares sind ein gutes Beispiel für diese Konvention.Die grundlegende Middleware kann ein Lambda sein, oder Sie können mithilfe von Klassen komplexere Logik bereitstellen.
Andere Tipps
Ich benutze immer die Option 3. In Anbetracht der syntaktischen Mehrdeutigkeiten, Methoden ohne Klammern anrufen zu können, ist dies der nächstgelegene Methodenrufsyntax.
Ich habe die erste Art und Weise gesehen, die in Rack Quellcode verwendet wurde.Es verwirrte mich schon lange.Es wird von lib / rack / builder.rb ( version: 1.6.0.alpha )
ausgewählt generasacodicetagpre.