2008-10-10 6 views
5

Je regardais la méthode Logging.logger bibliothèque exploitation forestière Ruby et une question de la source at github relative à ce morceau de code:Ruby Meta Programmation Question

logger = ::Logging::Logger.new(name) 
    logger.add_appenders appender 
    logger.additive = false 

    class << logger 
    def close 
     @appenders.each {|a| a.close} 
     h = ::Logging::Repository.instance.instance_variable_get :@h 
     h.delete(@name) 
     class << self; undef :close; end 
    end 
    end 

Je comprends que l'enregistreur de classe < < ouvre la classe eigen/meta/singleton à l'objet logger pour ajouter une méthode de fermeture d'instance d'instance. Cependant, je ne suis pas exactement sûr de ce que fait la «classe < < soi; undef: close; end» et dans quel but. Quelqu'un peut-il me dire ce que cela signifie?

Répondre

10

cela supprime réellement la méthode (quand elle est effectivement exécutée). C'est une garantie pour s'assurer que la fermeture n'est pas appelée deux fois. Il semble qu'il y ait des constructions 'class < <' imbriquées, mais il n'y en a pas. La classe interne < < est exécutée lorsque la méthode est appelée et la classe externe < < est appelée lorsque la méthode est définie.