イミュータブルなオブジェクト

前回の純粋なオブジェクト指向って?でそれはデータの管理方法が全て参照型であるとうことがわかりました。

ゆえに、どんなオブジェクトにもメソッドが使えるんだという結論に至りましたが・・・

    "hoge".reverse
    :hoge.reverse

どちらもreverseというmethodをりようしていますが、前者は名前の通り"egoh"となります。

しかし後者はundefined method というエラーが出てしまいました。

あれまぁ、このことからどうやら上記の結論は早とちりだったみたいですね。

なぜundefindeになったのかもう少し調べてみました。

まず、オブジェクトとは何かに注目してみます。

オブジェクトとは

  • 自分とそれ以外を区別できる
  • 他のオブジェクトとやりとりをするメッセンジャーの機能がある(阪神の選手じゃありません)
  • 内部状態を持つ

という三つの条件があるそうです。

区別というのはオブジェクトIDで行われています。

    "hoge".object_id

ですぐに確認ができます。

2つめのメッセージ機能と内部状態というのが今回のundefinedをもたらした重要な条件です。

もともと:hogeはsymbolクラスのオブジェクトでイミュータブル(不可変)なオブジェクトになります。

イミュータブルとは何か、プログラミングでいえば内部状態の変更を許さないということです。

イミュータブルのオブジェクトはセキュリティ的な部分で必要なオブジェクトです。それについてはまた今度考えたいです。

話を戻しますが、これの変更を許すか許さないかというのが2つめの野球選手の役割です。

他のオブジェクトとのやりとりを行う際に、データにアクセスする(getter), データを変更する(setter) があります。

Symbolクラスではセッターを禁止することでイミュータブルなオブジェクトを実現しているということです。

つまりsymbolのオブジェクトを引数に渡したりデータにアクセスするmethodは使えるということになります。

今回わかったことは全てのメッソドがオブジェクトに対して有効だとは限らないということでした。

次回はイミュータブルなオブジェクトがどんな風に役立つのか、また少し踏み込んでRubyはCで書かれているので時間があるときにイミュタブルなオブジェクトのデータ構造を調べてまとめてみたいと思います。


All Rights Reserved