Ruby Meta Programming Question - PullRequest
       17

Ruby Meta Programming Question

5 голосов
/ 10 октября 2008

Я изучал метод ведения журнала в Ruby Logging.logger, и у меня есть вопрос из источника на github относительно этого фрагмента кода:

  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

Я понимаю, что class << logger открывает класс eigen / meta / singleton для объекта logger, чтобы добавить метод close, специфицирующий экземпляр. Тем не менее, я не совсем уверен, что делает «class << self; undef: close; end» и для какой цели. Может кто-нибудь сказать мне, что это значит? </p>

1 Ответ

11 голосов
/ 10 октября 2008

это фактически удаляет метод (когда он действительно выполняется). Это гарантия того, что close не вызывается дважды. Похоже, что есть вложенные конструкции класса <<, но их нет. Внутренний класс << выполняется при вызове метода, а внешний класс << вызывается при определении метода. </p>

...