我知道如果我将String类的子类化并覆盖其capitalize方法,我可以用super
调用String类的capitalize版本。如果我重新打开String类并重写大写方法会怎样?有没有一种方法可以调用该方法的早期版本?
不开箱即用。一种常见的方法是将现有方法重命名为新名称。然后,在重写的版本中,用新名称调用旧方法。
def String
alias to_i old_to_i
def to_i
#add your own functionality here
old_to_i
end
end
您可能还想看看alias_method_chain
,它为您做了一些这方面的工作。
还有另一种有趣的方法可以让super
工作——如果要打开的类支持它(例如,因为它是自己编写的):
类的方法不是直接在类主体中定义的,而是在随后包含的另一个模块中定义的。要覆盖重新打开的类的方法,请使用它的扩展版本(可能使用super
)包含您自己的模块。
例如,这在irb替代ripl中用于让插件实现自己版本的核心方法(调用super
以获得原始行为)。