Как аргументы передаются в проц? - PullRequest
0 голосов
/ 16 сентября 2009
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}

Запуск этой программы приводит к выводу:

proc:10
foo:15

Как значение 3 из блока foo передается в proc? Я ожидал этот вывод :

proc:10
foo:10

proc всегда вызывается со значением 5 в качестве аргумента , поскольку foo определяется как:

    a.call(5)

Почему в выводе foo 15?

Ответы [ 2 ]

4 голосов
/ 17 сентября 2009

Значение 3 не передается процессу, поскольку вы не передаете s в foo Вы, вероятно, хотели написать

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

или

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

Кроме того, они эквивалентны:

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 голосов
/ 16 сентября 2009

Поскольку блок выводит x*3 (в отличие от s, который возвращает x*2), а 5*3 равно 15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...