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?

Était-ce utile?

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
scroll top