Pregunta

Digamos que su compañero de trabajo monkeypatches la clase Fixnum y redefine el método + para restar en lugar de sumar:

class Fixnum
  def +(x)
    self - x
  end
end

>> 5 + 3
=> 2

Tu problema es que desee acceder a la funcionalidad original del procedimiento +. Así se le cae este código en antes de su en el mismo archivo de origen. Se alias el método + para "original_plus" antes que monkeypatches él.

class Fixnum
  alias_method :original_plus, :+
end

class Fixnum
  def +(x)
    self - x
  end
end

Ahora se puede acceder a la funcionalidad original del procedimiento + a través original_plus

>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8

Pero lo que necesito saber es lo siguiente:

¿Hay alguna otra manera de cargar este alias antes de que sus cargas monkeypatch además se pegue en el mismo archivo de origen que se modifica?

Hay dos razones por las que mi pregunta:

  1. I puede no querer que sepa que yo he hecho esto
  2. Si el archivo de origen se altera de manera que el alias termina por debajo de los monkeypatch, entonces el alias ya no se va a producir el resultado deseado.
¿Fue útil?

Solución

Claro. Sólo se adhieren los anti-monkeypatch en el código antes que requieren su archivo de origen.

 % cat monkeypatch.rb
 class Fixnum
   def +(x)
     self - x
   end
 end
 % cat mycode.rb
 class Fixnum
   alias_method :original_plus, :+
 end
 require 'monkeypatch'
 puts 5 + 3 #=> 2
 puts 5.original_plus(3) #=> 8

Otros consejos

Monkeypatching es agradable para extender una clase existente y añadir nuevas funciones. Monkeypatching para cambiar el comportamiento de las características existentes es una locura!

En serio, usted debe hablar con su compañero de trabajo.

Si como en su ejemplo, él redefinir un método existente sólo para cambiar su comportamiento, usted debe hablar con él y le aconsejan utilizar alias_method_chain con el fin de salvar el comportamiento existente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top