细化范围如何工作?

时间:2015-05-26 18:50:18

标签: ruby

这实际上是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时,为什么不进行优化?

2 个答案:

答案 0 :(得分:2)

它避免了“泄漏”细化,例如,细化将特别应用于您精炼的方法。

http://yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice/

非常靠近底部,这个功能被解释;概括地说:

  

[精炼]不应泄漏[...]。如果确实如此,则意味着对任何方法的任何调用都可能泄漏对该方法的细化,这与该特征的目的相反。

答案 1 :(得分:1)

refine关键字用于本地优化课程。这意味着我们可以通过改进类来修补任何方法。

在您的情况下,只有在方法直接调用时,才会激活细化/ redfined / monkey补丁的过程。精炼也是范围的词汇。当控制权转移到范围之外时,细化将被停用。

要获得更好的洞察力,请从此处阅读scope部分优化内容:Refinements