2011-06-08 55 views
5

我知道如果我繼承String類並覆蓋它的大寫方法,我可以用super調用String類的大寫版本。如果我重新打開了String類並重寫了大寫方法呢?有沒有辦法可以調用該方法的以前版本?Ruby重新打開類 - 可否重寫方法被訪問?

+0

這是[當猴子修補方法時,你能否從新實現中調用重寫的方法](http://StackOverflow.Com/q/4470108/)。 – 2011-06-10 16:20:03

回答

5

不開箱即用。常用的方法是將現有方法重命名爲新名稱。然後,在您的重寫版本中,用新名稱調用舊方法。

def String 
    alias to_i old_to_i 
    def to_i 
     #add your own functionality here 
     old_to_i 
    end 
end 

你也可能想看看alias_method_chain,其中做了一些爲你處理。

0

也有另一種有趣的方法來獲得super工作 - 如果打開類支持它(例如,因爲它是由你自己寫的):

類的方法不是直接在類主體中定義,但在另一個包含的模塊中。要覆蓋重新打開的類的方法,請使用它的擴展版本(可能使用super)包含您自己的模塊。

例如,在irb-ripl中使用這個插件來讓插件實現他們自己版本的核心方法(調用super來獲得原始行爲)。