为什么我不能这样做:
do_once = Proc.new { yield } do_once.call { puts 1 }
irb抛出LocalJumpError:没有给出块(yield)
解决方法
yield适用于传递给包装方法上下文的块.在你的情况下,我认为它是irb依赖的任何方法(lib / ruby / 2.0.0 / irb / workspace.rb:86评估,如果调用者是任何东西).
如果你将它包装在一个函数中它将起作用,因为你改变了方法上下文:
def do_stuff do_once = Proc.new { yield } do_once.call end do_stuff { puts 1 }
注意上面没有do_once.call的块:yield适用于传递给do_stuff的块,而不是传递给do_once的块.
或者,明确声明块以避免完全使用yield:
do_once = Proc.new { |&block| block.call } do_once.call { puts 1 }