2012-01-14 8 views
0

例えば、我々は持っている:ここではメソッドがオーバーライドされないのはなぜですか?

module X 
def test 
    "X" 
end 
end 

module Y 
def test 
    "Y" 
end 
end 

class L 
include X 
end 

L.new.test #=> "X" 

class L 
include Y 
end 

L.new.test #=> "Y" 

class L 
include X 
end 

L.new.test #=> "Y" 

は奇妙なことです。最後のインクルードがメソッドをXのメソッドに変更しなかったのはなぜですか?

答えて

2

Rubyでは1つのモジュールを2回含むことはできませんが、2回目の試みは無視されます。カバーの下にModule#includeで使用されているModule#append_featuresのドキュメントから

Rubyのデフォルトの実装は、このモジュールが既に追加されていない場合、MODに定数、メソッド、およびこのモジュールのモジュール変数を追加することですmodまたはその祖先の1人に

+0

しかし、モジュールがクラスに含まれるたびに 'included'モジュールのコールバックを呼び出すのはなぜですか? – megas

+0

'Module#include'ソースを見てください。最初に 'append_features'を呼び出し、モジュールが実際にそれに含まれているかどうかにかかわらず、' included'フックを呼び出します。 –

関連する問題