文法
module Mod def test return "Mod" end end class Cls def test return "Cls" end include(Cls) end p Cls.new()test()
上のスクリプトを実行すると何が表示されるか。答えは"Cls"。
実はモジュールをincludeすると既存のメソッド定義を上書きするのだと勘違いしていた。
実際はClsの親としてModが追加されるので、Cls内部でメソッドを検索して見付からなかった際にModのメソッドが検索されるという順になる。
だからMod#test()はCls#test()に覆い隠されて利用することは出来ない。
モジュールをincludeしたときにメソッドを上書きするためには次のようにすれば良い。
module Mod def test return "Mod" end def self.included(klass) klass.__send__(:alias_method, :test_old, :test) klass.__send__(:remove_method, :test) end end class Cls def test return "Cls" end include(Cls) end p Cls.new()test()
要するにモジュールをincludeした際に古いメソッド定義を消すわけだ。
ちなみにundefでは上手くいかないのでドキュメントを参照。