为什么我不能这样做:
do_once = Proc.new { yield } do_once.call { puts 1 }
irb抛出LocalJumpError: no block given (yield)
答案 0 :(得分:7)
yield
适用于传递给包装方法上下文的块。在您的情况下,我认为它是irb
所依赖的任何方法(lib/ruby/2.0.0/irb/workspace.rb:86 evaluate
,如果caller
可以通过的话。)
如果将它包装在一个函数中,它将起作用,因为你改变了方法上下文:
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 }
答案 1 :(得分:5)
你可以这样做:
do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }