我的理解是,必须生成隐式附加到方法的块;不能调用它。所以我试图理解为什么这是有效的:
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年晚些时候提出。