RubyとPHP(仮) 基本的な違い(3)
2008年05月16日(金)12:10|天方
RubyとPHPの基本的な違い第三弾です。
変数とデータ型(3)
RubyのTrueClass/FalseClassがわかれているわけ
Rubyでブーリアン(真理値)を表すクラスはTrueClass/FalseClassの二つに分かれています。なぜ、BooleanではなくTrueClass/FalseClassに分かれているのか?そんな疑問をもったことはありませんか?
わざわざ別れているのには意味がある。そう思って、今回はちょっとだけ調べてみました。
普通に考えるとBooleanクラスがあればよいような局面で、TrueClass/FalseClassに分かれている今回のような設計をデザインパターンでは、Immutableパターンと呼びます。Rubyのブーリアンの設計は、このImmutableパターンのメリットを受けようとしているようです。
既にそういったことは TrueClass, FalseClass – Rubyco(るびこ)の日記
で指摘されていますし、より詳細な解説も一部のサイトでされているものを見受けました。(すみません、そちらのサイトは再度探したのですが発見することができませんでした。)また、Rubyの設計者やメーリングリストでもその意図を語られているかもしれませんが、今回はまとめるという意味で、解説をしてみたいと思います。
まず、Immutableパターンとは、
・クラスにはフィールドが一つもない
・クラスのオブジェクトはコピーしても実態は一つ(参照コピーとなる)
のようなクラスで
・複数のオブジェクトから参照されても、内容が変わってしまうことをなくし、
参照コピーによるオブジェクト生成、コピーのコストを低減する
パターンです。
このパターンを適用しているもので有名なものとしては、C++やJavaの文字列型(::std::stringやjava.util.String)があります。(RubyのTrueClass/FalseClassも有名なものに含まれるかもしれませんが ^ ^;)
Rubyでこのパターンを使うことでうれしいのは、ブーリアン同士の比較を行う場合に、値の比較ではなく参照の比較をすればよいことです。
また、、オブジェクトに複数のブーリアン値を格納した場合でも、ブーリアンの参照のみオブジェクトが保持すればよく、ブーリアンの値はメモリにたかだか2個用意すればよいということになります。(もしこれがImmutableでなければ、参照と値をブーリアンの個数だけ持つ必要があります)
以上がTrueClass/FalseClassのまとめになります。
ではまた。