2008-12-02 7 views
8

¿Cómo verificas que el parche de mono se haya hecho a una clase específica en Ruby? Si eso es posible, ¿también es posible obtener la (s) implementación (es) anterior (es) del atributo que se ha corregido?¿Cómo se detecta que el parche de mono ha ocurrido en Ruby?

+0

podría estar relacionado con mi:? Http://stackoverflow.com/questions/175655/how-to-find-where-a-ruby-method-is-defined-at-runtime - si alguien se da cuenta de esto, ¡por favor hágamelo saber también! –

Respuesta

3

Encontré este blog que habla sobre cómo usar method_added para rastrear el parche de mono. No es demasiado difícil extenderlo para rastrear los métodos que fueron parcheados.

http://hedonismbot.wordpress.com/2008/11/27/monkey-business-2/:

Mediante el uso de clases abiertas, podemos volver a definir method_added para las instancias de la clase y hacer algunas cosas costumbre cada vez que se define un método para cualquier clase. En este ejemplo, estamos redefiniendo method_added para que rastree dónde se definió el método por última vez.

#!/usr/bin/env ruby                                       

class Class 
    @@method_history = {} 

    def self.method_history 
     return @@method_history 
    end 

    def method_added(method_name) 
     puts "#{method_name} added to #{self}" 
     @@method_history[self] ||= {} 
     @@method_history[self][method_name] = caller 
    end 

    def method_defined_in(method_name) 
     return @@method_history[self][method_name] 
    end 
end 
8

Hay los ganchos method_added y method_undefined. Garry Dolley ha escrito un I mmutable module que evita el parche del mono.

Cuestiones relacionadas