Ruby元编程问题

ott*_*bar 5 ruby metaprogramming

我正在查看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
Run Code Online (Sandbox Code Playgroud)

据我所知,类<< logger打开了loginger对象的eigen/meta/singleton类来添加一个实例特定的close方法.但是,我并不完全确定"类<< self; undef:close; end"的用途和用途.谁能告诉我它意味着什么?

Dav*_*hme 11

这实际上删除了该方法(当它实际执行时).确保关闭不被调用两次是一种安全措施.它看起来有嵌套的'class <<'结构,但没有.调用方法时执行内部类<< <<,当定义方法时调用外部类<<.