昨日の記事で、この文脈ではモノのことを、オブジェクト、インスタンス、レシーバと呼ぶことがあるが、すべて同じ意味である。と書いた。最近やっと理解できてきたので、まとめておく。
オブジェクト
オブジェクトとは、モノのことである。Rubyでは、全てがオブジェクトである。
たとえば"apple"
は、String(文字列)クラスのオブジェクト、1
や2
や3
はInteger(整数)クラスのオブジェクト。
オブジェクトの種類のことをクラスという。逆にいえば、全てのオブジェクトは必ず何らかのクラスに属している。クラスは自分で作ることもできる。
class
メソッドを使えば、どのクラスに属するオブジェクトなのかを調べることができる。
"apple".class #=> String String.class #=> Class
"apple"
はStringクラスのオブジェクト。そしてString
はClassクラスのオブジェクト。
Rubyでは全てがオブジェクトなので、クラス自身もオブジェクトなのである。ここはわかりにくいので、最初はわからなくてもいいと思う。クラス名は頭文字が大文字。
インスタンス
インスタンスは、基本的にオブジェクトと同じだが、クラスとの関係を強調したいときなどに使われるイメージ。
英単語の instance は、「具体的な例、実例」という意味。
先ほどの「"apple"はStringクラスのオブジェクト。そしてStringはClassクラスのオブジェクト。」は、「"apple"はStringクラスのインスタンス。そしてStringはClassクラスのインスタンス。」と言い換えることができる。
自分の中でのイメージは、オブジェクトは、モノ。りんごとかパソコンとか、あらゆるモノ。
インスタンスは、クラスという型で型付けされた、モノ。型にはめられてその形になって出てきたモノ、というイメージ。頭の中ではたいやきを思い浮かべる。実際にはモノであることに変わりはないのだが。
クラスの話の中でインスタンスメソッドとかインスタンス変数という用語が出てくるので、そういう文脈で使うときはインスタンスと言うことが多いのかも。オブジェクトメソッドとかオブジェクト変数と言ってる人は見たことがない。
オブジェクトとインスタンスは基本的に同じものと考えて問題ないと思う。
レシーバ
レシーバは、receive(受け取る)に er がついて「受け取る人」というような意味で、メソッドを呼び出される側のオブジェクトのこと。
昨日の記事で以下のような文章があった。
publicなメソッドは、クラスの外部から
オブジェクト名.メソッド名
という形で特定のオブジェクトに対して呼び出すことができる。上の例では最終行
area.execute
の部分。areaという名前をつけたAreaクラスのモノ(オブジェクト)に対して、executeメソッドを呼び出している。
このarea.execute
のarea
のように、メソッドを呼び出される主体である、特定のモノ(オブジェクト)のことを、レシーバという。「executeメソッドのレシーバはareaです。」と言える。
オブジェクト名.メソッド名
の、オブジェクト名の部分に入るものを指すと思えばいい。
privateメソッドは、クラスの外で特定のモノを指定して
.メソッド名
で呼び出すような使い方ができない。
これも昨日の記事だが、この文章は、「privateメソッドは、レシーバを指定したメソッド呼び出しができない」と言い換えることができる。というか通常はこのように書かれている。
(5月18日追記)
後から気づいたのだが、インスタンスと聞いて自分がたいやきを思い浮かべるのはこの記事を読んだからだ。