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

proc, ruby

Solution

`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 }

Problem

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)`

Original source