如何解决Ruby:隐式块转换为 Proc
我的理解是隐式附加到方法的块必须被屈服;它不能被调用。所以我试图理解为什么会这样:
def execute_code
proc.call
end
execute_code { "Why does this work?" } # => "Why does this work?"
将块附加到此代码会成功执行。
有什么见解吗?我没有发现任何文档暗示隐式块会自动转换为 proc 对象并分配给变量 proc
。
红宝石 2.5.3
解决方法
对于 Ruby 2.5.3,docs for Kernel#proc()
表示:
相当于 Proc.new。
和 docs for Proc.new
说:
创建一个新的 Proc
对象,绑定到当前上下文。 Proc::new
可以在没有块的情况下仅在具有附加块的方法中调用,在这种情况下,该块将转换为 Proc
对象。
这就是您的示例中发生的情况。您在带有块的方法中调用 proc
,并且该块正在转换为 Proc.
但是这种行为在以后的版本中发生了变化。如果你在 Ruby 2.7,1 中尝试,你会得到这样的警告(虽然它仍然有效):
proc.rb:2: warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
在 Ruby 3 中,它根本无法工作(实际上就像您预期的那样):
proc.rb:2:in `proc': tried to create Proc object without a block (ArgumentError)
from proc.rb:2:in `execute_code'
from proc.rb:5:in `<main>'
docs for 3.0.0 没有变化。这看起来像是文档中的错误(fixed in master)。看起来这首先是在 2014 的问题跟踪器中提出的,然后是 2019。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。