Techioz Blog

Rubyのinstance_execに、それ自体がブロックを期待しているブロックを渡すことはできますか?

概要

コードを期待しています

foo=proc{puts "foo"}

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

出力する


1
2
3
foo
bar

しかし、エラーが発生しました


both block arg and actual block given

Rubyのinstance_execに、それ自体がブロックを期待しているブロックを渡すことはできますか?

解決策

&foo は foo をブロックとして instance_exec に渡そうとしますが、すでに明示的なブロックを渡しています。アンパサンドを省略すると、他の引数と同じように foo が送信されます (Proc インスタンスであることを除く)。したがって、代わりにこれを試してください。

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

これは、次のようなことができることも意味します。

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

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

そして同じ結果が得られます。

詳細については、「Ruby のブロックと &block の違い」を参照してください。