¿Cómo se puede influir en la secuencia en la que se carga el código Ruby?
-
22-08-2019 - |
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:
- I puede no querer que sepa que yo he hecho esto
- 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.
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.