调用 Proc 时出现 ArgumentError
s = Proc.new {|x|x*2}
puts s.call(5)
-> 10
def foo(&a)
a.call(5)
end
puts "test foo:"
foo(s)
当我尝试调用上面的 proc 时,我得到:
foo: wrong number of arguments (1 for 0) (ArgumentError)
我的期望是,如果该方法是使用这种类型的签名定义的,我可以将 proc 传递给该方法:
def foo(&a)
然后我可以像这样执行 proc insiide foo :
a.call(5)
s = Proc.new {|x|x*2}
puts s.call(5)
-> 10
def foo(&a)
a.call(5)
end
puts "test foo:"
foo(s)
When I try to call the proc above, I get:
foo: wrong number of arguments (1 for 0) (ArgumentError)
My expectation was that I can pass a proc to a method if the method is defined with this type of signature:
def foo(&a)
and then I can execute the proc insiide foo like this:
a.call(5)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您想将实际的过程传递给 foo,只需使用
def foo(a)
定义它即可。将&
放在a
前面意味着“这实际上不是一个参数。而是采用传递给此方法的块,创建一个proc 出来,并将该 proc 存储在变量 a" 中。换句话说,根据当前的定义,您可以像这样调用 foo:在调用方法将过程转换为块时,您还可以使用
&
:If you want to pass an actual proc to foo, just define it with
def foo(a)
. Putting the&
in front ofa
means "this isn't actually an argument. Instead take the block passed to this method, create a proc out of it, and store that proc in the variable a". In other words with your current definition you can call foo like this:You can also use
&
when calling a method to turn a proc into a block: