5

我有一个带有写入日志的方法的模块。在每条消息中,我想输入记录此消息的类的名称。

该模块可以混合使用includeextend。我需要我的日志在每种情况下都有正确的类名。

蒸馏代码:

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

无需求助于钩子,只需在 / 时改变你selfClass行为Module

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 回答