2008-10-10 4 views
5

나는이 코드 조각에 관한 source at github에서 질문 라이브러리 Logging.logger 방법을 기록하고있는 루비보고 있었다 : I 클래스 < < 로거가 열립니다 이해루비 메타 프로그래밍 질문

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 

을 eigen/meta/singleton 클래스를 로거 객체에 추가하여 인스턴스 지정 close 메서드를 추가합니다. 그러나 정확히 어떤 클래스 "< <; undef : close; end"가 무엇을 목적으로하는지 확신 할 수 없습니다. 아무도 그것이 무엇을 의미하는지 말할 수 있습니까?

답변

10

실제로이 메소드가 삭제됩니다 (실제로 실행될 때). 닫기가 두 번 호출되지 않도록하는 것이 안전 장치입니다. 중첩 된 '클래스 < <'구조가있는 것처럼 보이지만 존재하지 않습니다. 메서드가 정의되면 내부 클래스 < <이 호출되고 메서드가 정의 될 때 외부 클래스 < <이 호출됩니다.