为什么模块初始化方法没有被调用?

时间:2012-06-06 06:24:21

标签: ruby

为什么此模块的initialize方法在Temp类中包含时未被调用?

module Temp
  def initialize
    p "asdasd"
  end
end

class Swap
  include Temp
  def initialize
    p "m in class"
  end
end

s = Swap.new
  

m在课堂上

3 个答案:

答案 0 :(得分:13)

Swap类会覆盖initialize模块中定义的Temp方法。当Ruby尝试查找方法时,它会从最派生的类/模块开始搜索继承层次结构。在这种情况下,搜索以Swap类结束。

除非您使用super明确调用它们,否则不会调用重写的方法。例如

class Swap
  include Temp
  def initialize
    p "m in  class"
    super
  end
end

将从Temp#initialize致电Swap#initialize

答案 1 :(得分:9)

因为你在类和模块中都定义了初始化,Ruby会在移动到其他类/模块之前在自己的类中查找方法。

要查看祖先链,请尝试此

s = Swap.new
puts s.class.ancestors

你会看到链,并知道Ruby开始找到它的功能。

答案 2 :(得分:-3)

它只调用范围内的构造函数。

如果要调用模块初始化方法,则必须直接调用它。

module Temp
  def self.initialize
    p "asdasd"
  end
end

class Swap
  include Temp
  def initialize
    p "m in class"
    Temp.initialize
  end
end

s = Swap.new