ArgumentError при вызове Proc

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)

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

 a.call(5)

person uzo    schedule 16.09.2009    source источник
comment
С помощью def foo(&a) вы также можете передать блоку yield(5).   -  person glenn jackman    schedule 17.09.2009


Ответы (1)


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

foo do |x|
  puts x*2
end

Вы также можете использовать & при вызове метода для превращения процедуры в блок:

foo(&s)
person sepp2k    schedule 16.09.2009