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,文档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 年晚些时候提出。


以上是Ruby:隐式块转换为Proc的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>