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オーバーライドします。Ruby がメソッドを見つけようとすると、最も派生したクラス/モジュールから始まる継承階層が検索されます。この場合、検索は Swap クラスで終了します。initializeTemp

で明示的に呼び出さない限り、オーバーライドされたメソッドは呼び出されませんsuper。例えば

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

から電話Temp#initializeSwap#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 に答える