Ruby:隐式块转换为过程



我的理解是,必须生成隐式附加到方法的块;不能调用它。所以我试图理解为什么这是有效的:

def execute_code
proc.call
end
execute_code { "Why does this work?" } # => "Why does this work?"

将块附加到此代码成功执行。

有什么见解吗?我没有发现任何文档暗示隐式块会自动转换为proc对象并分配给变量proc

Ruby 2.5.3

对于Ruby 2.5.3,Kernel#proc()的文档说:

相当于Proc.new.

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>'

3.0.0的文档没有变化。这看起来像是文档中的一个错误(已在master中修复(。这似乎是在2014年首次在问题跟踪中提出的,然后在2019年晚些时候提出。

相关内容

  • 没有找到相关文章

最新更新