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

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

 module Temp def initialize p "asdasd" end end class Swap include Temp def initialize p "m in class" end end s = Swap.new 

在课堂上

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

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

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

将从Swap#initialize调用Temp#initialize Swap#initialize

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

要看到祖先的链,试试这个

 s = Swap.new puts s.class.ancestors 

您将看到链,并知道Ruby开始找到它的function。

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

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

 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