为什么我不能在Ruby中将块传递给proc?

时间:2013-06-27 20:57:54

标签: ruby proc

为什么我不能这样做:

do_once = Proc.new { yield }
do_once.call { puts 1 }

irb抛出LocalJumpError: no block given (yield)

2 个答案:

答案 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 }