benjaminchanming benjaminchanming - 16 days ago 5
Ruby Question

Can I pass a block which itself expect a block to instance_exec in ruby?

I expect the code

foo=proc{puts "foo"}

instance_exec(1,2,3,&foo) do |*args , &block|
puts *args
block.call
puts "bar"
end


to output


1
2
3
foo
bar


But got the error


both block arg and actual block given


Can I pass a block which itself expect a block to instance_exec in ruby?

Answer

&foo tries to pass foo as a block to instance_exec, and you are already passing an explicit block. Omitting ampersand sends foo just like any other argument (except that it is a Proc instance). So, try this instead:

instance_exec(1,2,3,foo) do |*args, block|
  puts *args
  block.call
  puts "bar"
end

This also means that you can do something like:

bar = proc{ |*args, block|
  puts *args
  block.call
  puts "bar"
}

instance_exec(1,2,3,foo,&bar)

And get the same result.

More info at Difference between block and &block in Ruby

Comments