我很难理解为什么以下不起作用:
module M1
def m1
p 'm1'
end
module ClassMethods
def m1c
p 'm1c'
end
end
def self.included base
base.extend ClassMethods
end
end
module M2
include M1
def m2
p 'm2'
end
end
class Foo
include M2
def hi
p 'hi'
end
end
Foo.new.hi => 'hi'
Foo.new.m1 => 'm1'
Foo.new.m2 => 'm2'
Foo.m1c => undefined method `m1c' for Foo:Class (NoMethodError)
如果我将M1
直接包含在Foo
中,则所有方法都按预期工作,但似乎DRYer将其包含在M2
中。我误解了模块吗?
答案 0 :(得分:1)
当您在include M1
中执行M2
时,M1
的实例方法以及来自ClassMethods
的类方法会合并到M2
中,因为self.included
中的M1
定义。
但是当您在include M2
中执行Foo
时,您只包含M2
的实例方法。 M2
的类方法未纳入Foo
。