2011-03-22 19 views
7

¿Cómo redefino un método de clase en ruby?Ruby - ¿Cómo redefinir los métodos de clase?

dicen, por ejemplo, quiero redefinir el método File.basename("C:\abc.txt") ¿Cómo lo hago?

Esto no funciona:

class File 
    alias_method :old_bn, :basename 

    def basename(*args) 
    puts "herro wolrd!" 
    old_bn(*args) 
    end 
end 

me sale : undefined method 'basename' for class 'File' (NameError)

por cierto, estoy usando JRuby

Respuesta

15

alias_method es para los métodos de instancia. Pero File.basename es un método de clase.

class File 
    class << self 
    alias_method :basename_without_hello, :basename 

    def basename(*args) 
     puts "hello world!" 
     basename_without_hello(*args) 
    end 
    end 
end 

El class << self evalúa todo en el "nivel de clase" (Eigenklass) - por lo que no es necesario escribir self. (def self.basename) y alias_method se aplica a los métodos de la clase.

+2

¿Qué pasa con solo 'clase << Foo'? –

+4

Preferencia personal. Si echo un parche, tiendo a buscar 'class File' en mi' core_ext' y quiero encontrar todas las modificaciones allí. También es más fácil googlear 'class << self' y averiguar qué significa eso si las personas nuevas comienzan a trabajar en ese código y aún no lo han visto. –

1
class << File 
    alias_method :old_bn, :basename 
    def basename(f) 
    puts "herro wolrd!" 
    old_bn(*args) 
    end 
end 
Cuestiones relacionadas