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)
答案 0 :(得分:7)
如果您想将实际的proc传递给foo,只需使用def foo(a)
定义它。将&
放在a
前面意味着“这实际上不是一个参数。而是将块传递给此方法,从中创建一个proc,然后存储在变量a中触发“。换句话说,使用您当前的定义,您可以像这样调用foo:
foo do |x|
puts x*2
end
在调用方法将proc转换为块时,您也可以使用&
:
foo(&s)