Module#method_addedの挙動

すいません、Rubyのドキュメントを見ながら動作を追っていて、疑問に感じたので質問をさせてください。 Module#me...

donttalktome さんからの 回答

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

  • 2017-05-27 10:58:04
  • 回答No.1
donttalktome

ベストアンサー率 90% (10/11)

インスタンスメソッドを「クラス#メソッド」、特異メソッドを「クラス.メソッド」と書きます。

すべてのクラスはクラス 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

お礼率 61% (167/273)

なるほど、Rubyそこそこ触って来ていたつもりですが、こうやって追いかけていくとわからないところがまだまだ掘られて行きますね。
納得がいきました。
ありがとうございます。
投稿日時 - 2017-05-31 15:24:06
この回答にこう思った!同じようなことあった!感想や体験を書こう!
この回答にはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
ページ先頭へ