【发布时间】:2013-07-22 23:50:24
【问题描述】:
我可以在 Proc 中生成一个块吗?考虑这个例子:
a = Proc.new do
yield
end
a.call do
puts "x"
end
我想要实现的是打印 x,但是用 ruby 2.0 解释它会引发 LocalJumpError: no block given (yield)。
【问题讨论】:
标签: ruby proc yield-keyword
我可以在 Proc 中生成一个块吗?考虑这个例子:
a = Proc.new do
yield
end
a.call do
puts "x"
end
我想要实现的是打印 x,但是用 ruby 2.0 解释它会引发 LocalJumpError: no block given (yield)。
【问题讨论】:
标签: ruby proc yield-keyword
不,你不能,因为你创建的 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
【讨论】:
obj.instance_eval { def wrap(&block); a = ->&block { block.() }; a.() { puts 'goodbye' }; end}; obj.wrap { puts 'hello'; yield } 只会打印goodbye