Ruby类模块包含类方法和继承

时间:2014-04-25 18:05:59

标签: ruby

我很难理解为什么以下不起作用:

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中。我误解了模块吗?

1 个答案:

答案 0 :(得分:1)

当您在include M1中执行M2时,M1的实例方法以及来自ClassMethods的类方法会合并到M2中,因为self.included中的M1定义。

但是当您在include M2中执行Foo时,您只包含M2的实例方法。 M2的类方法未纳入Foo