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 の違い」を参照してください。