オプションのブロックを取るメソッドを書くとき、私は通常、次のようなものを使用します
block.call if block_given?
ただし、以下のように動的に定義されたメソッドでは、block_given?
機能しないようです。
class Foo
%w[bar baz].each do |method_name|
define_singleton_method(method_name) do |&block|
puts "Was #{method_name} given a block? #{block_given?}"
puts block.call
end
end
end
Foo.bar { puts 'I am a block' }
ブロックは期待どおりに呼び出されますが、 block_given?
falseを返します。
どうしてこれなの?