オブジェクト・インスタンスの違いとレシーバ

昨日の記事で、この文脈ではモノのことを、オブジェクト、インスタンス、レシーバと呼ぶことがあるが、すべて同じ意味である。と書いた。最近やっと理解できてきたので、まとめておく。

オブジェクト

オブジェクトとは、モノのことである。Rubyでは、全てがオブジェクトである。

たとえば"apple"は、String(文字列)クラスのオブジェクト、123はInteger(整数)クラスのオブジェクト。

オブジェクトの種類のことをクラスという。逆にいえば、全てのオブジェクトは必ず何らかのクラスに属している。クラスは自分で作ることもできる。

classメソッドを使えば、どのクラスに属するオブジェクトなのかを調べることができる。

"apple".class
#=> String

String.class
#=> Class

"apple"はStringクラスのオブジェクト。そしてStringはClassクラスのオブジェクト。

Rubyでは全てがオブジェクトなので、クラス自身もオブジェクトなのである。ここはわかりにくいので、最初はわからなくてもいいと思う。クラス名は頭文字が大文字。

インスタンス

インスタンスは、基本的にオブジェクトと同じだが、クラスとの関係を強調したいときなどに使われるイメージ。

英単語の instance は、「具体的な例、実例」という意味。

先ほどの「"apple"はStringクラスのオブジェクト。そしてStringはClassクラスのオブジェクト。」は、「"apple"はStringクラスのインスタンス。そしてStringはClassクラスのインスタンス。」と言い換えることができる。

自分の中でのイメージは、オブジェクトは、モノ。りんごとかパソコンとか、あらゆるモノ。

インスタンスは、クラスという型で型付けされた、モノ。型にはめられてその形になって出てきたモノ、というイメージ。頭の中ではたいやきを思い浮かべる。実際にはモノであることに変わりはないのだが。

f:id:masuyama13:20200517115540p:plain

クラスの話の中でインスタンスメソッドとかインスタンス変数という用語が出てくるので、そういう文脈で使うときはインスタンスと言うことが多いのかも。オブジェクトメソッドとかオブジェクト変数と言ってる人は見たことがない。

オブジェクトとインスタンスは基本的に同じものと考えて問題ないと思う。

レシーバ

レシーバは、receive(受け取る)に er がついて「受け取る人」というような意味で、メソッドを呼び出される側のオブジェクトのこと。

昨日の記事で以下のような文章があった。

publicなメソッドは、クラスの外部からオブジェクト名.メソッド名という形で特定のオブジェクトに対して呼び出すことができる。

上の例では最終行area.executeの部分。areaという名前をつけたAreaクラスのモノ(オブジェクト)に対して、executeメソッドを呼び出している。

このarea.executeareaのように、メソッドを呼び出される主体である、特定のモノ(オブジェクト)のことを、レシーバという。「executeメソッドのレシーバはareaです。」と言える。

オブジェクト名.メソッド名の、オブジェクト名の部分に入るものを指すと思えばいい。

privateメソッドは、クラスの外で特定のモノを指定して.メソッド名で呼び出すような使い方ができない。

これも昨日の記事だが、この文章は、「privateメソッドは、レシーバを指定したメソッド呼び出しができない」と言い換えることができる。というか通常はこのように書かれている。


(5月18日追記)

後から気づいたのだが、インスタンスと聞いて自分がたいやきを思い浮かべるのはこの記事を読んだからだ。

オブジェクト指向プログラミングの考え方 - komagataのブログ