调用 Proc 时出现 ArgumentError

发布于 2024-08-05 03:20:29 字数 408 浏览 4 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一身软味 2024-08-12 03:20:29

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

foo do |x|
  puts x*2
end

在调用方法将过程转换为块时,您还可以使用 &

foo(&s)

If you want to pass an actual proc to foo, just define it with def foo(a). Putting the & in front of a 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:

foo do |x|
  puts x*2
end

You can also use & when calling a method to turn a proc into a block:

foo(&s)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文