- ベストアンサー
Module#method_addedの挙動
- 質問者は、RubyのModule#method_addedメソッドについて疑問を持っています。
- Module#method_addedメソッドは、Moduleクラスにメソッドが追加された際に呼び出されるメソッドです。
- しかし、質問者がModuleにメソッドを追加してもmethod_addedが呼び出されない理由がわかりません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
インスタンスメソッドを「クラス#メソッド」、特異メソッドを「クラス.メソッド」と書きます。 すべてのクラスはクラス Class の子クラスであり、 Class の親クラス Module の子クラスでもあるので、 Module のプライベートメソッドであるとは、 module、class 文内で関数のように レシーバなしでメソッドを呼び出せるということです。 また、特異クラスは継承ツリー上で必ず元クラスより下位になります。 つまり最初に特異メソッドがメソッド探索されます。 1 Object.method_added を定義する。これは特異メソッドなので、 フックする singleton_method_added がまだない。 2 Object.singleton_method_added の定義後すぐにそれをフックして、 同メソッドが呼ばれる 3 Module.method_added 定義をフックして Object.singleton_method_added が呼ばれる 4 Module.singleton_method_added 定義をフックして Object.singleton_method_added が呼ばれる 5 モジュール Foo はクラス Module のインスタンスで モジュールは特異クラスを持たないので特異クラスのメソッド探索はない。 もし Module#singleton_method_added、Object#singleton_method_added が定義されていたら、Foo.foo 定義をフックするが、 定義されていないので何もしない 6 同様に Foo#foo2 定義をフックする Module#method_added、 Object#method_added がないので何もしない 7 Bar.bar 定義をフックして Object.singleton_method_added が呼ばれる 8 Bar#bar2 定義をフックして Object.method_added が呼ばれる 典型的使い方: https://pastebin.com/myeP9uJq include、extend どちらでも同じようにできます。
お礼
なるほど、Rubyそこそこ触って来ていたつもりですが、こうやって追いかけていくとわからないところがまだまだ掘られて行きますね。 納得がいきました。 ありがとうございます。