我正在编写一个可以动态创建方法的类。但是,当我将此代码(方法)嵌套add_method
在递归函数中时,我新创建的方法会采用第二次递归传递的值,而不是保留第一次传递的值。
运行下面的示例代码可能更好地解释我的问题:
class Klass
def initialize
in_frame(:id => 'first_frame') do |frame|
add_method "bar", {:frames => frame}
in_frame({:id => 'second_frame'}, frame) do |frame|
#do absolutely nothing
end
end
end
def add_method(name, identifiers)
puts "adding the #{name} method with these frames #{identifiers}"
define_singleton_method(name){
puts "I shouldn't see a second_frame here: #{identifiers}"
}
end
def in_frame(identifier, frame=[], &block)
frame << identifier
block.call(frame)
end
end
Foo = Klass.new
Foo.bar
第二帧由“second_frame”标识,但该方法是在 first_frame 块中创建的,并且该方法在第二个递归代码块开始之前完全创建并完成。
那么如果是这样的话,为什么 Foo.bar 会返回 second_frame?