• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Module#method_addedの挙動)

Module#method_addedの挙動

このQ&Aのポイント
  • 質問者は、RubyのModule#method_addedメソッドについて疑問を持っています。
  • Module#method_addedメソッドは、Moduleクラスにメソッドが追加された際に呼び出されるメソッドです。
  • しかし、質問者がModuleにメソッドを追加してもmethod_addedが呼び出されない理由がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 どちらでも同じようにできます。

m_matsubara
質問者

お礼

なるほど、Rubyそこそこ触って来ていたつもりですが、こうやって追いかけていくとわからないところがまだまだ掘られて行きますね。 納得がいきました。 ありがとうございます。

関連するQ&A