【发布时间】:2017-10-07 18:30:19
【问题描述】:
在第 2 章的“细化”部分的Metaprogramming Ruby 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可能会让你措手不及:即使你在using之后调用another_method,对my_method的调用本身也会发生在using之前——因此它调用了该方法的原始、未改进的版本。
这完全把我绊倒了。
为什么MyClass.new.another_method 打印“original my_method()”,因为它在using MyClassRefinement 之后使用,作者在这里想说什么?
谁能提供更直观/更好的解释?
谢谢。
【问题讨论】:
-
这可能是因为细化引入的重新映射仅适用于特定范围,并且在原始定义中该范围不受影响。
标签: ruby metaprogramming refinements