Y at-il des questions de priorité Ruby à l'utilisation Proc.call par rapport Proc. []?
-
22-09-2019 - |
Question
Récemment, je discutais avec un ami au sujet de Proc
Ruby. Vous pouvez appeler un Proc
dans l'une de plusieurs façons. Une façon est d'invoquer Proc.call
:
p = Proc.new { |x| "hello, #{x}" }
p.call "Bob"
=> "hello, Bob"
Une autre consiste à utiliser des accolades, Proc.[]
:
p ["Bob"]
=> "hello, Bob"
Y a-t-il des problèmes de priorité potentiels ici, ou sont ces deux déclarations complètement interchangeables? Si non, pouvez-vous donner un exemple d'un contexte où différents résultats seraient fournis?
La solution
La technique de #call
permet à la priorité de l'opérateur à l'intention potentiellement obscure:
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]"
La syntaxe []
rend l'association syntaxique des arguments à la méthode plus robuste, mais vous auriez le même effet en mettant entre parenthèses autour des arguments à Proc#call
.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow