2015-05-26 45 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