【问题标题】:ArgumentError calling a ProcArgumentError 调用 Proc
【发布时间】:2009-09-16 18:19:22
【问题描述】:
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)

【问题讨论】:

  • 使用 "def foo(&a)" 你也可以 "yield(5)" 到块。

标签: ruby proc-object


【解决方案1】:

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

foo do |x|
  puts x*2
end

您也可以在调用方法时使用 & 将 proc 变成一个块:

foo(&s)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多