这实际上是Ruby Metaprogramming 2的一个片段。在这一部分中,他们对这个例子有所了解,但并没有真正的解释。
module MyRefinement
refine MyClass do
def my_method
"refined"
end
end
end
class MyClass
def my_method
"original"
end
def another_method
my_method
end
end
using MyRefinement
obj = MyClass.new
puts obj.my_method #=> "refined"
puts obj.another_method #=> "original"
当您从其他方法拨打my_method
时,为什么不进行优化?
答案 0 :(得分:2)
它避免了“泄漏”细化,例如,细化将特别应用于您精炼的方法。
http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/
非常靠近底部,这个功能被解释;概括地说:
[精炼]不应泄漏[...]。如果确实如此,则意味着对任何方法的任何调用都可能泄漏对该方法的细化,这与该特征的目的相反。
答案 1 :(得分:1)
refine
关键字用于本地优化课程。这意味着我们可以通过改进类来修补任何方法。
在您的情况下,只有在方法直接调用时,才会激活细化/ redfined / monkey补丁的过程。精炼也是范围的词汇。当控制权转移到范围之外时,细化将被停用。
要获得更好的洞察力,请从此处阅读scope
部分优化内容:Refinements