Ruby 元编程问题

5

我在查看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

我理解类<<logger打开了eigen/meta/singleton类以便将实例特定的close方法添加到logger对象中。然而,我不确定"class << self; undef :close; end"的作用和目的是什么。有人能告诉我它的含义吗?

1个回答

11

这实际上删除了方法(当它被执行时)。这是一种保障措施,以确保 close 不会被两次调用。它看起来有嵌套的 'class << ' 结构,但实际上并没有。内部的 class << 在方法被调用时执行,而外部的 class << 在方法被定义时调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接