为什么这个模块的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
米在课堂上
为什么这个模块的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
米在课堂上
该类Swap
覆盖模块initialize
中定义的方法。Temp
当 Ruby 试图找到一个方法时,它会从最派生的类/模块开始搜索继承层次结构。在这种情况下,搜索在 Swap 类结束。
除非您使用super
. 例如
class Swap
include Temp
def initialize
p "m in class"
super
end
end
Temp#initialize
将从调用Swap#initialize
。
因为您在类和模块中都定义了初始化,Ruby 会在移动到其他类/模块之前在其自己的类中查找方法。
要查看祖先链,试试这个
s = Swap.new
puts s.class.ancestors
您将看到链,并知道 Ruby 从哪里开始找到它的功能。
它只调用范围内的构造函数。
如果你想调用模块初始化方法,你必须像这样直接调用它。
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