在Metaprogramming Ruby 2的第 2 章的“细化”部分中,我发现了以下 Ruby 代码:
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
可能会让你措手不及:即使你调用another_method
afterusing
,对my_method
自身的调用也会发生在之前using
——所以它调用了原始的、未优化的方法版本。
这完全把我绊倒了。
为什么要MyClass.new.another_method
打印“original my_method()”,因为它using MyClassRefinement
是在之后使用的,作者在这里想说什么?
谁能提供更直观/更好的解释?
谢谢。