我知道如果我继承String类并覆盖其capitalize方法,我可以使用super
调用String类的大写版本。如果相反我重新打开String类并重写了capitalize方法呢?有没有办法可以调用该方法的先前版本?
答案 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
来获取原始行为)。