Вопрос по мета-программированию на Ruby

Я смотрел метод Logging.logger библиотеки журналов Ruby и получил вопрос от источник на 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, чтобы добавить метод закрытия экземпляра. Однако я не совсем уверен, что делает «class << self; undef: close; end» и с какой целью. Кто-нибудь может сказать мне, что это значит?

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
5
0
642
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме