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)
有帮助吗?

解决方案

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

foo do |x|
  puts x*2
end

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

foo(&s)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top