Ruby重新打开类 - 可以访问重写的方法吗?

时间:2011-06-08 19:46:18

标签: ruby ruby-on-rails-3

我知道如果我继承String类并覆盖其capitalize方法,我可以使用super调用String类的大写版本。如果相反我重新打开String类并重写了capitalize方法呢?有没有办法可以调用该方法的先前版本?

2 个答案:

答案 0 :(得分: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,其中包含了一些此功能。

答案 1 :(得分:0)

还有另一种让super工作的有趣方法 - 如果要打开的类支持它(例如因为它是由你自己编写的):

类的方法不是在类体中直接定义的,而是在随后包含的另一个模块中定义的。要覆盖重新打开的类的方法,请包含您自己的模块及其扩展版本(可能使用super)。

例如,在irb-alternative ripl中使用它可以让插件实现自己的核心方法版本(调用super来获取原始行为)。