2008-10-10 11 views
5

stavo guardando Ruby accedendo metodo di biblioteca Logging.logger e hanno una domanda dal source at github relativa a questo pezzo di codice:Rubino Meta Programming Domanda

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 

ho capito che la classe < < logger si apre la classe eigen/meta/singleton all'oggetto logger per aggiungere un metodo di chiusura specifice dell'istanza. Tuttavia, non sono esattamente sicuro di cosa sia la "classe < < self; undef: close; end" e per quale scopo. Qualcuno può dirmi cosa significa?

risposta

10

questo effettivamente elimina il metodo (quando viene effettivamente eseguito). È una garanzia assicurarsi che la chiusura non venga chiamata due volte. Sembra che ci siano dei costrutti "classe < <" nidificati, ma non ci sono. La classe interna < < viene eseguita quando viene chiamato il metodo e viene chiamata la classe esterna < < quando il metodo viene definito.