为什么此模块的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在课堂上
答案 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