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

fra*_*nza 4 ruby proc

为什么我不能这样做:

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

irb抛出 LocalJumpError: no block given (yield)

Den*_*rdy 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 }
Run Code Online (Sandbox Code Playgroud)

注意do_once.call上面没有阻塞:yield适用于传递给的块do_stuff,而不是传递给的块do_once.

或者,明确声明块以避免完全使用yield:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }
Run Code Online (Sandbox Code Playgroud)


Mar*_*pka 5

你可以做:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }
Run Code Online (Sandbox Code Playgroud)