2011-06-08 73 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来获得原始行为)。