2009-09-16 19 views
0
s = Proc.new {|x|x*2} 
puts s.call(5) 
-> 10 

def foo(&a) 
a.call(5) 
end 

puts "test foo:" 
foo(s) 

Lorsque je tente d'appeler le proc ci-dessus, je reçois:ArgumentError appeler un Proc

foo: wrong number of arguments (1 for 0) (ArgumentError) 

Mon attente est que je peux passer un proc à une méthode si la méthode est définie avec ce type de signature:

def foo(&a) 

et je peux exécuter le proc insiide foo comme ceci:

a.call(5) 
+0

Avec def » foo (& a) "vous pouvez aussi" céder (5) "au bloc. –

Répondre

7

Si vous souhaitez passer un proc réel à foo, il suffit de le définir avec def foo(a). Mettre le & devant a signifie "ce n'est pas un argument, mais plutôt le bloc passé à cette méthode, en créer un proc, et stocker ce proc dans la variable a". En d'autres termes avec votre définition actuelle, vous pouvez appeler foo comme ceci:

foo do |x| 
    puts x*2 
end 

Vous pouvez également utiliser & lorsque vous appelez une méthode pour transformer un proc dans un bloc:

foo(&s) 
+0

+1 pour "Vous pouvez également utiliser et lors de l'appel ..." –