5

ログに書き込むメソッドを備えたモジュールがあります。各メッセージに、このメッセージを記録したクラスの名前を入れたいと思います。

includeモジュールは、またはを使用して混在させることができますextend。いずれの場合も、ログに正しいクラス名を付ける必要があります。

蒸留コード:

module M
  def f
    self.class.name
  end
end

class C
  extend M
  include M
end

p C.f # => "Class"
p C.new.f # => "C"

ご覧のとおり、最初の呼び出しではが正しく出力されません"Class"。私もそうなりたいです"C"

これを達成する方法は?

4

2 に答える 2

4

フックに頼る必要はありません。 /の場合selfの動作を変更するだけです。ClassModule

module M
  def f
    self.is_a?(Module) ? name : self.class.name
  end
end

class C
  extend M
  include M
end

C.f     #=> "C"
C.new.f #=> "C"
于 2013-02-08T22:40:36.130 に答える
3

あなたはこのようにそれを行うことができます、より良い方法が存在するかどうかはわかりません。

module M
  def self.included(base)
    base.extend ClassMethods
  end

  def f
    self.class.name
  end

  module ClassMethods
    def f
      self.name
    end
  end
end

class C
  include M
end
于 2013-02-08T22:18:27.790 に答える