10

为什么这个模块的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

米在课堂上

4

3 回答 3

17

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

除非您使用super. 例如

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

Temp#initialize将从调用Swap#initialize

于 2012-06-06T08:09:03.263 回答
9

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

要查看祖先链,试试这个

s = Swap.new
puts s.class.ancestors

您将看到链,并知道 Ruby 从哪里开始找到它的功能。

于 2012-06-06T08:09:37.887 回答
-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
于 2012-06-06T08:10:54.877 回答