1

先看下面的示例代码:

module First
  def initialize
    puts "Second init"
  end

  def first
    puts "first"
  end
end

module Second
  def initialize
    puts "Second init"
  end

  def second
    puts "second"
  end
end

class MyClass
  include First
  include Second

  def initialize
    super()
  end
end

c = MyClass.new
c.first
c.second

该程序的输出是:

Second init
first
second

从输出中,我们可以看到它MyClass很好地包含FirstSecond模块,因为它同时具有first()second()方法。

MyClass构造函数中,我尝试使用 初始化两个包含的模块super(),但似乎只Second调用了构造函数。

如何初始化所有包含的模块?

4

2 回答 2

3

include在当前类和它的祖先之间插入一个模块。由于First, thenSecond被包括在内,其祖先MyClass

[MyClass, Second, First, ...]

关键字super查找祖先类中除了它自己的类之外的第一个可用方法。它发现Second#initialize.

如果要累积initialize祖先模块的方法,请执行以下操作:

module First
  def initialize
    puts "Second init"
  end
end

module Second
  include First
  def initialize
    super
    puts "Second init"
  end
end

class MyClass
  include Second
  def initialize
    super
  end
end
于 2013-09-04T01:57:56.207 回答
2

这些模块应该super在那里调用自己的initialize

module First
  def initialize
    puts "First init"
    super
  end

  def first
    puts "first"
  end
end

module Second
  def initialize
    puts "Second init"
    super
  end

  def second
    puts "second"
  end
end

class MyClass
  include First
  include Second

  def initialize
    super
  end
end

c = MyClass.new
c.first
c.second

输出:

第二个初始化
第一个初始化
第一个
第二个

于 2013-09-04T02:02:03.500 回答