【Ruby】メソッド呼び出し時の「メソッド探索」を理解する
はじめに
これまでRubyのメソッド呼び出しについて深く考えたことがありませんでしたが、そのプロセスを理解することはオブジェクト指向設計を理解するために必要と感じたので、今回はRubyのメソッド探索について学んだことをまとめたいと思います。
メソッド探索とは
Rubyに限らず、オブジェクト指向言語では、メソッドを呼び出す時に、メソッドを探す → メソッドを実行するというプロセスを経てメソッドを呼び出しています。このメソッドを探すという処理がメソッド探索にあたります。
メソッド探索のプロセス
メソッド探索では、レシーバのクラスを探索してメソッドを発見しています。具体的には、まずレシーバのクラスに入り、メソッドを探します。そこで見つからなければ継承しているスーパークラスを順に辿って行き、Rubyのクラス階層のルートにあたるBasicObjectクラスまでメソッドを探しに行きます。この過程を継承チェーンと呼び、継承チェーンの道筋には、モジュールも含まれます。
継承チェーンの確認方法
継承チェーンはancestors
メソッドで確認できます。
実際のコードで確認してみる。
module M def method_m "method_m" end end class A include M end class B < A; end B.ancestors # => [B, A, M, Object, Kernel, BasicObject]
上記はBクラスの継承チェーンを表示しています。
従って、以下のように、BクラスのインスタンスはMモジュールのメソッドを呼び出すことができます。
b = B.new b.method_m # => "method_m"
上記では、bに対して呼び出されたmethod_m
は、B → A → Mと継承チェーンを辿ってメソッドを発見しています。