为什么我不能这样做:
do_once = Proc.new { 产量 } do_once.call { puts 1 }
irb 投掷LocalJumpError: no block given (yield)
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 }
注意上面没有块 for do_once.call
:yield
适用于传递给 的块do_stuff
,而不是传递给 的块do_once
。
或者,显式声明该块以避免完全使用 yield:
do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }
你可以做:
do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }