とよぶ

歌いながらコード書いてます

Rubyのオブジェクトモデル1

メタプログラミングRubyを読んで学んだことを元にまとめる。


もくじ

  1. Rubyのオブジェクトとは
  2. Rubyのクラスとは
  3. Rubyのメソッド探索

Rubyのオブジェクトとは

Rubyにおいて、オブジェクトと呼ばれるものは、

class Takasing
  def toyo
  end
end
obj = Takasing.new

というところのobjのこと。
オブジェクトは

  1. インスタンス変数
  2. クラスへの参照

を保持している。
ここでいう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

ここからわかるのは

  1. すべてのクラスはClassクラスのインスタンスである
  2. クラス階層は「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の間にラッパーとして挿入されている。