0
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)
4

1 回答 1

7

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

foo do |x|
  puts x*2
end

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

foo(&s)
于 2009-09-16T18:23:57.270 回答