调用Proc的ArgumentError

时间:2009-09-16 18:19:23

标签: ruby proc-object

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)

我的期望是,如果使用此类签名定义方法,我可以将proc传递给方法:

def foo(&a)

然后我可以像这样执行proc insiide foo:

 a.call(5)

1 个答案:

答案 0 :(得分:7)

如果您想将实际的proc传递给foo,只需使用def foo(a)定义它。将&放在a前面意味着“这实际上不是一个参数。而是将传递给此方法,从中创建一个proc,然后存储在变量a中触发“。换句话说,使用您当前的定义,您可以像这样调用foo:

foo do |x|
  puts x*2
end

在调用方法将proc转换为块时,您也可以使用&

foo(&s)