8

为什么我不能这样做:

do_once = Proc.new { 产量 }
do_once.call { puts 1 }

irb 投掷LocalJumpError: no block given (yield)

4

2 回答 2

9

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.callyield适用于传递给 的块do_stuff,而不是传递给 的块do_once

或者,显式声明该块以避免完全使用 yield:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }
于 2013-06-27T21:12:49.827 回答
5

你可以做:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }
于 2013-06-27T21:14:11.833 回答