このモジュールがクラスに含まれているときに、このモジュールの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
オーバーライドします。Ruby がメソッドを見つけようとすると、最も派生したクラス/モジュールから始まる継承階層が検索されます。この場合、検索は Swap クラスで終了します。initialize
Temp
で明示的に呼び出さない限り、オーバーライドされたメソッドは呼び出されません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