2009-09-16 3 views
0
s = Proc.new {|x|x*2} 
puts "proc:" + (s.call(5)).to_s 

def foo(&a) 
    a.call(5) 
end 
foo{|x| puts "foo:" + (x*3).to_s} 

L'exécution de ce programme produit la sortie:Comment les arguments sont-ils transmis à procs?

proc:10 
foo:15 

Comment la valeur 3 du bloc foo être transmis au proc? Je m'y attendais cette sortie:

proc:10 
foo:10 

Le proc est toujours appelé à la valeur 5 comme argument parce que foo est défini comme:

a.call(5) 

Pourquoi est-foo 15 dans la sortie?

Répondre

4

La valeur 3 ne soit pas transmis au proc parce que vous n'êtes pas passer s-foo. Vous avez probablement voulu écrire

foo {|x| puts "foo: #{s.call(x)}"} 

ou

puts "foo: #{foo(&s)}" 

De plus, ceux-ci sont équivalentes:

def foo_1(x, &a) 
    puts a.call(x) 
end 
def foo_2(x) 
    puts yield(x) 
end 

foo_1(5, &s) #=> 10 
foo_2(5, &s) #=> 10 
4

Parce que les sorties de bloc x*3 (par opposition à s qui retourne x*2) et 5*3 est 15.

+0

Quand j'appelle foo, ce qui arrive à a.call (5)? C'est ignoré? Je pensais qu'il serait appelé et la sortie serait 10. – uzo

+0

@uzo: 'a' est le bloc' {| x | met "foo:" + (x * 3) .to_s} '. Ce bloc multiplie l'argument times 3. Donc quand vous l'appelez avec l'argument 5, vous obtenez 5 * 3, ce qui est 15. – Chuck

+0

Bien sûr, il n'est pas ignoré. a est appelé avec l'argument 5. a puis sort 5 * 3, soit 15. – sepp2k

Questions connexes