混合模块中的self.class.name

时间:2013-02-08 22:10:15

标签: ruby

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

可以使用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"

如何做到这一点?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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