Rubyのオブジェクトモデル1
メタプログラミングRubyを読んで学んだことを元にまとめる。
もくじ
- Rubyのオブジェクトとは
- Rubyのクラスとは
- Rubyのメソッド探索
Rubyのオブジェクトとは
Rubyにおいて、オブジェクトと呼ばれるものは、
class Takasing def toyo end end obj = Takasing.new
というところのobjのこと。
オブジェクトは
- インスタンス変数
- クラスへの参照
を保持している。
ここでいうtoyoというメソッドはオブジェクトではなくクラスが保持している。
なお、
objは変数で、Takasingクラスのとあるインスタンスを参照している。
Takasingはクラス名定数である。
というくらいの認識で良い。
Rubyのクラスとは
まずはirb
irb> class Takasing; end => nil irb> Takasing.class => Class irb> Takasing.superclass => Object irb> Object.class => Class irb> Object.superclass => BasicObject irb> BasicObject.superclass => nil irb> BasicObject.class => Class irb> Class.class => Class irb> "toyo".class => String irb> toyo = Takasing.new irb> toyo.class => Takasing
ここからわかるのは
- すべてのクラスはClassクラスのインスタンスである
- クラス階層は「BasicObject > Object > その他のクラス」
たいしたことがわかるわけではないけどw
Rubyのメソッド探索
上記で述べたように、オブジェクトのメソッドはクラスが保持している。
つまり
obj -> class -> method!
という風に探索するのが基本。
Rubyで変数からメソッドを呼び出すと、レシーバ(呼び出すメソッドが属するオブジェクト。obj.toyoという記述の場合objがレシーバとなる)から参照しているクラスに向かって探索を開始する。これをBasicObjectまで続ける。
「Rubyのクラスとは」で定義したものを使って説明すると、
toyo.hogeみたいなメソッドを実行した時、toyo -> Takasing -> Object -> BasicObjectという順番で探索する(継承チェーン)。
その過程でメソッドが見つかればそのメソッドが実行される。
ちなみにその継承チェーンを取得するには
irb> Takasing.ancestors => [Takasing, Object, Kernel, BasicObject]
というメソッドを実行するのだが、ここでKernelというものが出てくる。
RubyではModuleを定義することができるのだが、クラスにモジュールをインクルードした場合、そのモジュールを無形クラスとしてラップして継承チェーンに挿入する。
Rubyのソースコードにobject.cというファイルがあり、そこのコメントに
Object mixes in the Kernel module, making the built-in kernel functions globally accessible.
とある。つまりここではObjectがKernelをincludeしているので、継承チェーンのObjectとそのスーパークラスのBasicObjectの間にラッパーとして挿入されている。