为什么没有调用模块初始化方法?
为什么在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