From: Nakamura Akifumi Date: 2003-09-01T01:19:09+09:00 Subject: [ruby-list:38313] Re: 配列における「変数のモデル」 お世話になっております。 A.中村です。 On Sun, 31 Aug 2003 23:54:40 +0900 Kenta MURATA様 muraken2@nifty.com wrote: > そう言って理解してもらえるとは思えないのです.ここは,「オブジェ > クト同士は等価だが,全く別のオブジェクトである」と言う方が僕に > は分かりやすいですね. 世間的には、「同一性」と「同値性」という言葉を使うみたいですね。 そもそも同じオブジェクト(オブジェクト指向の言葉でいうならば) なら「同一」と呼ぶし、 同じオブジェクトじゃないんだけど何らかの事情(^^;で ある面において同じに見えるものなら「同値」っていうみたいです。 で、 「==」メソッドはたしかrubyでは、 同値性を評価するメソッドとして クラスごとに適切に実装される(べき)もの、 という位置付けでしたよね。 あ。リファレンスにも http://www.ruby-lang.org/ja/man-1.6/index.cgi?cmd=view;name=Object#self.20.3d.3d.20other 「このメソッドは各クラスの性質に合わせて再定義するべきです」 と書いてますね。 同一なら同値も成り立つ(ようにしとくのが 大抵の場合はオブジェクト指向的に自然)で、 一方、ものによっては同一じゃなくても同値だと見なすほうが 良さそうなクラスもあります。 伝統的な数字や文字列は、同一かどうかはさておいて 同値を同値と見なせるほうが好都合、ということは よく有りがちなことだと思います。 そこを表現するのが「==」なのであろうと思います。 んー、マニュアル参照。 「==」は 「「デフォルトでは」 equal? と同じ効果です。」 (内側の鍵括弧は原文には無くて、俺が追加したものです。) ともあります。 一方ここで引き合いに出されてる「equal?」のほうは 「other が self 自身の時、真を返します。 このメソッドを再定義してはいけません。」 だそうです。 これ、「equal?」のほうは、同一性のことを言ってるんでしょうね。 なるほど。同一性をOverrideされちゃったら、 オブジェクト指向としてはちょっと辛いでしょうね。 で、Objectクラスのデフォの挙動としては、 同値性はとりあえず同一性(equal?)にどっぷり依存するかたちで 定義してあって、あとは子クラスたちが自分の都合で 適宜変更してちょーだいね、という感じでしょうか。 > Fixnum と Symbol は,そのように定義されたクラスとして特別扱い > して良いのではないですか? これら以外にも例えば,Singleton パ > ターンを適用したクラスを定義すれば,インスタンスを生成しても, > ただひとつの特定のオブジェクトしか得られないようにすることも可 > 能ですよね. かなり余談だと思いますが、一応。 「インスタンスを生成」しちゃったら、 「ひとつの特定のオブジェクト」じゃなく 二個目が生まれちゃいます(^^; Singletonパターンは、二度目以降は生成「しない」 のが味噌っすね。 あえて言うなら「生成するふり」だと捉えるのは アリかも知れないけど、同じものしか得られていないのは 簡単にわかりますから、まあ薄い化けの皮です。 > # 僕は,[ruby-list:38207] で出て来た「杭」を用いた比喩が,色々 > # な要素を同時に含んでいて,良い比喩だと感じました. うん。あれ良いっすよねー。 あれが良いのは、(参照型の)変数の本質を説明するために、 違う概念で代用しようとせず、 同じ(あるいはせめて可能な限り似た)概念を 実世界から探してきた、という点にあるんだと思います。 ま、言語の変数だって、しょせんは人間が考案したもの なんだから、実世界に全然無いものを丸々創造した可能性は 必ずしも高くないんじゃないかなー。 こーゆーのを、Nothing new is under the Sun、 とかいうんでしたっけ?