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