2011-06-08 11 views
5

Sé que si hago una subclase de la clase String y anulo su método de capitalizar, puedo llamar a la versión de capitalización de la clase String con super. ¿Qué pasa si en su lugar volví a abrir la clase String y reescribí el método de capitalizar? ¿Hay alguna manera de llamar a la versión anterior de ese método?Clases de reapertura de Ruby: ¿se puede acceder a los métodos anulados?

+0

Este es un duplicado de [Cuando mono parcheando un método, puede llamar al método reemplazado de la nueva implementación] (http://StackOverflow.Com/q/4470108/). –

Respuesta

5

No fuera de la caja. Un enfoque común es cambiar el nombre del método existente por un nuevo nombre. Luego, en su versión reescrita, llame al método anterior por el nuevo nombre.

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

También puede que desee ver en alias_method_chain, lo que lo hace un poco de esto para usted.

0

También hay otro enfoque interesante para obtener super de trabajo - si la clase para abrir la soporta (por ejemplo, porque está escrito por sí mismo):

Los métodos de la clase no se definen directamente en el cuerpo de la clase, pero en otro módulo que luego se incluye. Para sobrescribir un método de la clase re-abierta, incluya su propio módulo con la versión extendida de este (que puede usar super).

Esto se usa, por ejemplo, en la irb-alternative ripl para permitir que los complementos implementen sus propias versiones de métodos principales (que llaman a super para obtener el comportamiento original).

Cuestiones relacionadas