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 クラスを logger オブジェクトに開き、インスタンス固有の close メソッドを追加することを理解しています。しかし、「class << self; undef :close; end」が何をし、何の目的で行われるのか正確にはわかりません。誰がそれが何を意味するのか教えてもらえますか?

4

1 に答える 1

11

これにより、実際にメソッドが削除されます(実際に実行されたとき)。close が 2 回呼び出されないようにするための安全策です。ネストされた 'class << ' コンストラクトがあるように見えますが、そうではありません。内部クラス << はメソッドが呼び出されるときに実行され、外部クラス << はメソッドが定義されるときに呼び出されます。

于 2008-10-10T14:39:31.313 に答える