From: Take_tk Date: 2003-08-24T02:41:40+09:00 Subject: [ruby-list:38204] Re: String << の動作につきまして たけ(tk)です。 [ruby-list:38196] Re: String << の動作につきまして にて Tadayoshi Funaba さん 曰く: > まず、たけさんは、変数は容器 (のようなもの) である、ということから出発 > していますよね。これは、「常識」に依った説明です。ところが、 > > a = b = 'foo' > > などをうまく説明できません。「常識」では、ひとつのモノをふたつ以上の容 > 器に収めることは出来ません。ここで早くも破綻しました。 > > そこで、たけさんは、「オブジェクトの共有」の一言で済ませようとしている > のかもしれませんが (今のところそう見えます)、それが、具体的にどういう > ことなのか解りません。容器を入れ子に格納するのでしょうか? 最初は具体 > 的だった説明も、いきなり抽象的で、ボケたものなってしまっています。 『Rubyの冒険』では変数への代入なるものが最初に出てきたときに、イメージの つかみやすさの観点から『箱に「もの」を入れるようなもの』としておき、 ---- p.70 ---- 2.5.4 代入  変数と代入に関しては後で詳しく説明するとして(※1)、ここでは箱に「も の」を入れるようなものだと考えてくれればOK。 ※1:「変数と代入」→p.215 ---- オブジェクトの共有がもたらす問題点やidメソッドが表示するものについて説明 した後で、次のように補足する、という方法を取ってみました。 ---- p.216 ---- 3.14.2 変数について  「変数にオブジェクトを代入する」ことを始めのほうで「箱に「もの」を入れ るようなもの」と説明した(※1)。  しかし今まで説明した通り、「オブジェクトの共有」の現象は「箱」では説明 ができない。1つの物が2つの箱に入るというのは現実的には不可能な話だ。 ……  変数とオブジェクトの関係についてもう少し正確に言うなら、変数にはオブジェ クトの所在地を示す番地が入っているだけだ(※2)。変数にオブジェクトを代 入するというのはオブジェクトそのものを変数に入れるのではなく、オブジェク トの番地を入れるだけだ。変数はオブジェクトの番地を記憶しているだけなので、 複数の変数が同一のオブジェクトの番地を保持することができる。つまり、共有 状態が可能になる。 ※1:→p.70 ※2:「番地」:インターネット版のリファレンスでは「オブジェクトの参照を 保持している」という表現になっている。しかし「オブジェクトの参照」という 表現で理解できるとすれば、初心者ではないだろう。また「オブジェクトの参照」 の実際上の具体的内容はオブジェクトがメモリ上で占めている番地なのだ。この 番地はidメソッドやエラーメッセージでも表示される。よって、本書ではより具 体的な「番地」という用語で説明することにした。 ---- * この説明は正確ではない。『Ruby本』p.401 には「Rubyの変数というのはオ ブジェクトへの参照を格納しているポインタであると考えることができます。が… いくつかのオブジェクトは変数の中に直接格納するようにしています」とある。 この例外については省略してある。 まだご不満ですか? take_tk = kumagai hidetake