我有一个模块,其中包含写入日志的方法。在每条消息中,我想要记录记录此消息的类的名称。
可以使用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"
。
如何做到这一点?
答案 0 :(得分:4)
无需诉诸钩子,只需在self
为Class
/ 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