2010-02-23 33 views
3

Récemment, j'avais une discussion avec un ami à propos de Proc de Ruby. Vous pouvez appeler un Proc de plusieurs façons. Une façon est d'invoquer Proc.call:Y at-il des problèmes de priorité Ruby avec l'utilisation Proc.call vs Proc. []?

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

Une autre est d'utiliser des accolades, Proc.[]:

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

Y at-il ici des problèmes de priorité potentiels, 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?

Répondre

2

La technique #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:[email protected](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.

+0

Hmm ... ce n'est pas tout à fait ce que je cherche. Cela montre une différence entre '.call (x) .call' et' .call x.call', pas '.call' et' [] '. –

+2

@ John Feminella, essayez 'p [" John "] [" Barry "]' pour voir la différence. Peut-être Aidan voudra-t-il ajouter cela à sa réponse. –

+1

@Wayne Conrad - Merci - J'ai incorporé un nouvel exemple basé sur cela. –