以下「メタプログラミングRuby」で勉強したことです。
メソッド探索
メソッド探索とは、その名の通り、呼ばれたメソッドを探すことである。
class A
def hoge
puts "hoge"
end
end
class B < A; end
obj_b = B.new
obj_b.hoge #=> "hoge"
obj_bがhogeを呼んだ時rubyの中では何が起こっているのだろうか。
rubyは以下の2つのことを行う。
・メソッドを探す(メソッド探索)
・メソッドを実行する
ではメソッド探索をする時、rubyはどのように動いているのだろう。
※レシーバ : 呼び出したメソッドが属するオブジェクト。hogeで言うobj_b
rubyはレシーバの「クラス」に入り、目的のメソッドが見つかるまで継承チェーンを上っていく。
「ん?レシーバのクラスに入る?」
「レシーバ自体は探索しないの?」
そうなのだ。メソッド探索はレシーバのクラスから探索を始めるのだ。
ここにrubyの秘密がある。
実はオブジェクトのメソッドは全てクラスに属しており、オブジェクトはクラスが持っているメソッドを参照しているだけなのだ。
だからメソッド探索は「レシーバのクラス」から探索を始めるようになっている。
obj_b.hogeの話に戻ろう。
ではobj_b.hogeを呼んだ時、rubyはまず何処を探すだろう?
そう、obj_bのクラスであるBだ。
しかし、クラスBにはhogeメソッドが定義されていない。
では次に何処を探すだろう?
rubyは「目的のメソッドが見つかるまで継承チェーンを上っていく」ので、次に探すのはクラスAだ。
クラスAを探して、ついにhogeメソッドを見つけることができた。
以上がrubyのメソッド探索である。
ここで覚えておくべきことは
・rubyはレシーバのクラスに入り、目的のメソッドが見つかるまで継承チェーンを上っていく。
・メソッドは全てクラスが持っている。オブジェクトはクラスが持っているメソッドを参照しているに過ぎない。
以上の2つである。