今更ながら、Rubyの基本知識についてまとめてみる。
クラスとインスタンス
Rubyの参考書でよく出てくる、「〇〇クラスのインスタンス」という表現について。
クラス
単に「種類」という程度に考えておけば問題ない。
Intergerクラスなら「整数という種類」。
「このオブジェクトはどのクラスのオブジェクトか」という問いは、
「このオブジェクトは整数?小数?文字列?それとも…」という意味。
インスタンス
〇〇の一種、というニュアンスに近い。
なので、例えば「Intergerクラスのインスタンス」は「整数の一種」という意味になる。
クラスとメソッド
クラスによって使えるメソッドが決まっているが、
一部、どのクラスに対しても使えるメソッドもある。
to_s #文字列以外のクラスを文字列に変換する
class #そのオブジェクトのクラスが何であるかを表示する
これは上記のメソッドが、全てのクラスの親クラス(スーパークラス)である、
Objectクラスのインスタンスメソッドであるため。
インスタンスメソッドというのは、
クラスあるいはモジュールをレシーバとするメソッドを「クラスメソッド」と呼ぶのに対し、
定数・変数といったインスタンスをレシーバとするメソッドのこと。
詳しくはこちらを参照。
オブジェクト及びクラスの親子関係
superclassメソッドを使うと、対象オブジェクトのクラスのスーパークラスを確認できる。
p 2.class.superclass #=> Numeric
p 2.class.superclass.superclass #=> Object
p 2.class.superclass.superclass.superclass #=> BasicObject
一番上のクラスがBasicObjectで、それ以上のクラスはないので、
superclassメソッドで見ようとしてもnilが返ってくる。
また、スーパークラスで使えるメソッドは、
サブクラスのオブジェクトに対しても使えるという特徴がある。
上記の例で言えば、2はIntergerクラスのインスタンスなので、
Interger, Numeric, Object, BasicObjectのクラスのメソッドが使える、ということ。
リテラル
Rubyのプログラム中に直接記述できる値のこと。
通常、インスタンスの生成には
クラス名.new(引数)
と記述する必要があるが、リテラルが設定されている値の場合は単に
"値"
と記述するだけでインスタンスが生成される。
例えば、文字列オブジェクトを定義する際は
str = String.new("Hello world!")
という風に記述する所を、
str = "Hello world!"
とだけ書けばよい。
尚、数値(Integer、Floatなど)、真偽値(True、False)、シンボル(Symbol)、Nilクラスは
そもそもnewでインスタンスを作れないようにしてある。
レシーバとメソッド
メソッドは基本的に以下の形式で使用する。
[オブジェクト].[メソッド名]
このオブジェクト側を「レシーバ」と呼ぶ。
レシーバとなったオブジェクトは呼び出されたメソッドが自身に使えるか否かを確認し、
可能なら実行、不可能ならエラーを返す。
putsやprintのように、レシーバを必要としないメソッドも存在するが、
実はプログラム実行時に「main」というObjectクラスのインスタンスが密かに作られており、
これをレシーバとすることで実行している。