A veces, aunque muy rara vez código de auto-modificación en Ruby.
A veces tiene un método en el que realmente no sabe si los datos que está utilizando (por ejemplo, un caché diferido) están inicializados correctamente o no. Por lo tanto, debe verificar al comienzo de su método si los datos están inicializados correctamente y luego tal vez inicializarlos. Pero realmente solo tienes que hacer esa inicialización una vez, pero la compruebas todas las veces.
Por lo tanto, a veces escribo un método que realiza la inicialización y luego se reemplaza con una versión que no incluye el código de inicialización.
class Cache
def [](key)
@backing_store ||= self.expensive_initialization
def [](key)
@backing_store[key]
end
@backing_store[key]
end
end
Pero, sinceramente, no creo que valga la pena. De hecho, me da vergüenza admitir que nunca comparé realmente para ver si ese condicional de realmente hace alguna diferencia. (En una moderna aplicación rubí con un compilador JIT optimización agresiva perfil de retroalimentación impulsada probablemente no.)
Tenga en cuenta que, dependiendo de cómo se definir "código mutante", esto puede o no ser lo que querer. Usted es reemplazando alguna parte del programa de ejecución actualmente, así que & hellip;
EDIT: Ahora que lo pienso, esa optimización no tiene mucho sentido. La costosa inicialización solo se ejecuta una vez de todos modos. Lo único que evita la modificación es el condicional. Sería mejor tomar un ejemplo donde el cheque sí mismo es costoso, pero no puedo pensar en uno.
Sin embargo, pensé en un buen ejemplo de código de auto-modificación: el Maxine JVM. Maxine es una VM de investigación (técnicamente no es realmente que se le haya permitido llamar como "JVM" porque sus desarrolladores no ejecutan las pruebas de compatibilidad) escrito completamente en Java. Ahora, hay muchas JVM escritas, pero Maxine es la única que sé que también ejecuta en sí mismo. Esto es extremadamente poderoso. Por ejemplo, el compilador JIT puede compilarse JIT para adaptarlo al tipo de código que está compilando JIT.
Algo muy similar ocurre en el Klein VM que es una máquina virtual para el lenguaje de auto programación.
En ambos casos, la máquina virtual puede optimizar y recompilar en sí en tiempo de ejecución.
¿Desea compilar/ejecutar código en tiempo de ejecución, o desea modificar el ejecutable mientras se carga en la memoria: esas son dos cosas * muy * diferentes. (Por lo general * "auto-modificación" * significa el segundo) –
@BlueRaja - Danny Pflughoeft: Estoy interesado en el segundo ... El primero es cuando el segundo es imposible o no está disponible ... – Betamoo
Solía pensar en mí mismo -Código de modificación mucho. Nunca he encontrado mucho uso después de aprender sobre punteros de función y lenguajes orientados a objetos. ¿Tienes algún uso en el mundo real para esto? –