Frage

Vor kurzem habe ich ein Gespräch mit einem Freund über Rubys Proc. Sie können eine Proc in einem von mehreren Möglichkeiten nennen. Eine Möglichkeit ist, invoke Proc.call :

p = Proc.new { |x| "hello, #{x}" }
p.call "Bob"
=> "hello, Bob"

Ein weiterer Grund ist Klammern zu verwenden, Proc.[]

p ["Bob"]
=> "hello, Bob"

Gibt es mögliche Vorrang Fragen hier, oder sind diese beiden Aussagen völlig austauschbar? Wenn nicht, können Sie liefern ein Beispiel für einen Kontext, in den unterschiedlichen Ergebnisse zur Verfügung gestellt würden?

War es hilfreich?

Lösung

Die #call Technik ermöglicht es dem Bediener den Vorrang potenziell unklar Absicht:

p = Proc::new do |a1| Proc::new do |a2| "#{a1.inspect}:#{a2.inspect}" end end
p.call([1,2,3]).call [1]
=> => "[1, 2, 3]:[1]"
p.call [1,2,3][1]
=> #<Proc:0x7ffa08dc@(irb):1>
p.call([1,2,3])[1]
=> "[1, 2, 3]:1"
p[[1,2,3]][[1]]
=> "[1, 2, 3]:[1]"

Die [] Syntax macht die syntaktische Zuordnung der Argumente für das Verfahren robuste, aber Sie würden die gleiche Wirkung erzielen, indem Klammern um die Argumente zu Proc#call setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top