2015-05-26 44 views
3

这实质上是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

阅读本https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/RefinementsSpec ...我困惑阅读完整页面后。 –

回答

2

它避免了“泄漏”的改进,例如,改进将特别是应用于您改进的方法。

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

非常接近这种功能进行说明的底部;简而言之:

[the] refinement should not leak [...]。如果是这样,这意味着任何调用任何方法都可能会将细化漏入该方法中,这与该功能的用途相反。

+0

谢谢,我会看看那篇文章。但是对于答案,我仍然不明白为什么'my_method'没有被“提炼”,只是因为它是从另一种方法调用的。如果我想改进它,然后让该类中的所有其他方法使用它,该怎么办? – Uri

+0

@Uri然后,你必须改变你的细化。底线是,这并不是如何改进工作。它没有被提炼,因为它不在你精炼的词汇范围内;链接的文章进一步的细节,但我不知道它会变得更清晰。 –

1

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

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

为了更好的理解,从这里读改进的scope部分:Refinements

+0

这个答案只是再次说明OP所观察到的,这并不是真正的解释_why_发生了这种情况。 –

+0

@PatrickOscity在推介链接中没有任何解释! ?你能再请再读一次,然后让我知道这是不正确的! –

+0

使用我的例子,你可以扩展在执行过程中的'scope'吗?我不明白范围的变化。 – Uri