diary結果、メモ的な内容になっています。この広告は、90日以上更新していないブログに表示しています。最近、ActiveRecordのコードを読み始めてすぐにやめたわけです。どこの何を呼び出してるか全然わからんちんですよ。それでまずは、表題の件(rubyでオブジェクトのメソッド探索ルール)について調べてから立ち向かおうかと。Qiitaまず、下記メソッドを沢山使いました。継承ツリーを取得<クラス>.ancestorsあと、本記事では使い忘れてしまったけど、下記メソッドも便利そうです。メソッドのオーナーを取得<インスタンス>.method(:<メソッド名>).owner本記事では、下記メソッドを使った場合のメソッド探索ルールについて調べてみます。Sub.new.method1これは実行すると、当然の結果が返ってくる。./test.rb"sub#method1"次に、Subクラスの、method1を削除して実行する。Sub.new.method1えい。./test.rb"super#method1"おお。Subのancestorsをみてみると、どっちの場合も同じ。BasicObject]includeをみてみる次は、Greatモジュールを作って、Subクラスにincludeしてみた。Sub.new.method1これで実行。./test.rb"great#method1"今度は、Greatモジュールのが実行された。BasicObject]おお。Superの手前に突っ込まれる、と。prependをみてみる次は、Fabulousモジュールを作って、Subクラスにprependしてみた。./test.rb"fabulous#method1"おおおお。BasicObject]おお。自分よりも前に突っ込まれている。prependはruby2.0から実装された機能みたいです。調べてみたところ、alias_method_chain撲滅できるぜ!なもののようです。それが主目的で開発されたわけではないかもしれませんが。BLOGさてさて、ここまできたら最後だ。似たようなことをやってるので、比べてみよう。今度は、Miracleモジュールを作って、Subクラスにextendしてみた。MiracleendSub.new.method1Sub.method1実行すると、こんな感じ。./test.rb"fabulous#method1""miracle#method1"Subクラスの特異メソッドとして動作している、と。BasicObject]あ、そうなのね。したいときに使用します。"って書いてあるとおり、Subクラスのオブジェクトだけに機能が追加されてるから、ancestorsに出てくるものではないのか。メソッド探索上でいうと、特異メソッドなので、一番優先度が高い、と。include/prependを何回も呼ぶと?何回も呼んだときは、どれが優先度高くなるのかね。Fabulous2こんなことをした場合。Fabulous2endSub.new.method1これで実行してみる。./test.rb"fabulous2#method1"お、一番最後にprependしたFabulous2が呼ばれた。BasicObject]おー。見事に後発優先ですな。Great1の順だもんね。