ruby – anula el método y luego revertir

Estoy tratando de encontrar una manera de anular un método, hacer algo y luego revertir sin dejar ningún objeto cerca.

He implementado esto usando mocha pero obviamente esto no va a volar en una aplicación de producción. Note que el nuevo método tiene parámetros y el anterior no.

Ejemplo como sigue

require 'rubygems' require 'mocha' class Example def to_something self.stubs(:attribs => other(1)) r = attribs_caller self.unstub(:attribs) r end def other(int) {"other" => int } end def attribs_caller attribs end def attribs {"this" => 1 } end end a1 = Example.new puts a1.attribs_caller #=> this1 puts a1.to_something #=> other1 puts a1.attribs_caller #=> this1 

Otra forma de hacerlo, sin crear un método adicional, es esta:

 class Foo def bar :old_method end end Foo.new.foo # => :old_method $old_method = Foo.new.method(:bar) class Foo def bar :new_method end end Foo.new.foo # => :new_method class Foo define_method($old_method.name, &$old_method) end Foo.new.foo # => :old_method 

Creo que esto es mejor que usar un método de alias. En Ruby los métodos son, también, objetos. Solo tomo la referencia del objeto antes de destruir la asociación del objeto (el método) con la clase. Después agrego el mismo método. También funciona si utiliza la palabra clave undef para eliminar el método de la clase. El punto negativo es que debes tener un objeto de la clase para tomar la referencia del método.

 class String alias orig_reverse reverse def reverse(n) 'fooled you. '*n end end puts "ab".reverse(2) #=> fooled you fooled you # clean up: class String alias reverse orig_reverse remove_method(:orig_reverse) end puts "ab".reverse #=> ba 
Intereting Posts