ArgumentError вызывает Proc - PullRequest
       8

ArgumentError вызывает Proc

0 голосов
/ 16 сентября 2009
s = Proc.new {|x|x*2}
puts s.call(5)
-> 10

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

puts "test foo:"
foo(s)

Когда я пытаюсь вызвать вышеуказанный процесс, я получаю:

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

Я ожидал, что я смогу передать метод в метод, если метод определен с этим типом подписи:

def foo(&a)

и тогда я могу выполнить proc insiide foo следующим образом:

 a.call(5)

1 Ответ

7 голосов
/ 16 сентября 2009

Если вы хотите передать фактический процесс в foo, просто определите его с помощью def foo(a). Помещение & перед a означает «это на самом деле не аргумент. Вместо этого возьмите блок , переданный этому методу, создайте из него proc и сохраните этот proc в переменной а». Другими словами, с вашим текущим определением вы можете назвать foo следующим образом:

foo do |x|
  puts x*2
end

Вы также можете использовать & при вызове метода, чтобы превратить процесс в блок:

foo(&s)
...