当我编写采用可选块的方法时,我通常使用类似
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。
为什么是这样?