简体   繁体   中英

Why can't I pass a block to the proc in Ruby?

Why can't I do something like this:

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

irb throws LocalJumpError: no block given (yield)

yield applies to the block passed to the wrapping method context. In your case, I presume it is whichever method irb relies upon ( lib/ruby/2.0.0/irb/workspace.rb:86 evaluate , if caller is anything to go by).

If you wrap it in a function it'll work, because you change the method context:

def do_stuff
  do_once = Proc.new { yield }
  do_once.call 
end

do_stuff { puts 1 }

Note the absence of block for do_once.call in the above: yield applies to the block passed to do_stuff , rather than to the block passed to do_once .

Alternatively, declare the block explicitly to avoid the use of yield altogether:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }

You can do:

do_once = Proc.new { |&block| block.call }
do_once.call { puts 1 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM