在Metaprogramming Ruby 2的 “加细” 一节,我发现了下面的一段Ruby代码:红宝石的改进在第2章陷阱
class MyClass
def my_method
"original my_method()"
end
def another_method
my_method
end
end
module MyClassRefinement
refine MyClass do
def my_method
"refined my_method()"
end
end
end
using MyClassRefinement
MyClass.new.my_method # => "refined my_method()"
MyClass.new.another_method # => "original my_method()" - How is this possible?
据笔者:
然而,呼叫到
another_method
可能会引起您的后顾之忧:即使您在using
之后致电another_method
,致电my_method
的呼叫本身也发生在using
之前 - 所以它会调用原始的未定义版本的方法。
这完全让我失望。
为什么MyClass.new.another_method
会打印“original my_method()”,因为它在using MyClassRefinement
之后使用,作者在此尝试说些什么?
任何人都可以提供更直观/更好的解释吗?
谢谢。
这可能是因为通过优化引入的重新映射仅适用于特定范围,并且在原始定义范围内,范围不受影响。 – tadman