我可以在Proc中生成一个块吗?考虑这个例子:
a = Proc.new do
yield
end
a.call do
puts "x"
end
我试图实现的是打印x
,但用ruby 2.0解释它会引发LocalJumpError: no block given (yield)
。
不可以,因为您创建的Proc是一个独立的yield
,也就是说,它是一个上下文中没有块的yield
。尽管您可以用指定的参数调用proc,从而将参数传递到proc中,但yield
不能基于指定的参数工作;它执行在proc的闭包中找到的块。并且proc的闭包是预定义的;它不会因为稍后用块调用而被修改。
因此,这相当于直接在irb
中键入"yield"(不在任何方法定义中),返回LocalJumpError: no block given (yield)
错误。
@Rebitzele解释了代码不起作用的原因:yield
关键字是调用已传递给方法的匿名块的简写符号,在这种情况下,甚至不是方法。
但你当然可以给这个块起一个名字,然后像调用任何其他可调用对象一样调用它:
a = ->&block { block.() }
a.() do puts 'x' end
# x