Gibt es Ruby-Vorrang Probleme bei der Verwendung Proc.call vs. Proc. []?
-
22-09-2019 - |
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?
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.