From: Shin-ichiro Hara Date: 1998-04-16T01:20:52+09:00 Subject: [ruby-list:7528] Re: scope 原です。 まだ若干の混乱があるかもしれないです。 > def test(a) > p a.id # --> 3 > a += 1 > p a.id # --> 5 > end > > a = 1 > p a.id # --> 3 > test(a) このコードではどこでも破壊的な操作は行われていないですよね。 a += 1 は、a の指すオブジェクトへ +1 といメッセージを送った 応答であるオブジェクトを a が指す様に仕向けている、いわば代 入文です。 「コピー」という言葉もここでは不適切では?オブジェクトのコ ピーは起こってないですよね。それから変数のコピーって無いで す。(alias はともかくとして。)ピンで止めた書類をコピーす ることはあるけど、ピンをコピーすることはめったにない。 参照のコピーっていうのはあるだろうけど。ruby では単に代入の 事ですね。 ここで余計なことを言うと「変数 a に破壊的操作を施す」という 言い回しは実は間違いで、正しくは「変数 a が指し示すオブジェ クトに破壊的操作を施す」が正しいです。前者を後者の省略形の言 い回しと言えば言えますが。このメーリングリストを「破壊的」で 検索すると、私の誤解に基づく発言が山のように出てくるはず。(^^; さらに蛇足ですが、a.id は a の id ではなく、a の指し示すオブ ジェクトの id です。当たり前ですけど。そもそもメソッドという のが、変数に対してなされるのではなく、変数の指し示すオブジェ クトに対してなされるのだから。 > スレッドを使っていると、このタイミングが問題になるんですよね。それでちょ > っと悩んでいたのです。 というわけで、常に変数の指し示すオブジェクトの事を意識してい れば、多分今回のケースでスレッドがらみのタイミングは問題にな らないのではないでしょうか。(本当に必要なときは synchronize などを使うのでしょうが。) ちなみに Array, Hash の組み込みの破壊的メソッドは、複数スレッ ドが走っていても排他的に実行されるはずです。(本当?) > このコピーのタイミングについては今後、どのようになるでしょうか? > 現在のまま、参照のみの場合はリファレンスとして使えると思って使ってしまっ > ても良いでしょうか? 青山さんはここでは「参照」を「破壊的でない」あるいは、「書込み 不可で読み出しのみ可」という意味で使ってるのかな。私は「参照」 を「リファレンス」と全く同じ意味で使っています。いずれにして もまだ誤解があるような、、、。 そういえば、a = 1 とか a = "b" というのを代入文と言うけど、 これがまぎらわしいんだな。オブジェクトを代入するような気分 になる。代入するのはオブジェクトへの参照なんだけど、参照な んて抽象的なものを代入するというのも、難しいと言えば難しい。 オブジェクトの先頭アドレスを代入しているのだとCの人は何ら 不思議に思わないでしょうけど。そもそも ruby では、「参照」 という言葉無しで話は済むはずですよね。参照という言葉を抹殺 した後、いよいよ「代入文で代入されるは何なの?」ということ になるに違いない。 ruby の代入文を「指示文」と呼んだらどうでしょう。でも、 a = b とは、b の指し示すモノを a も指し示すよう指示してい るわけで、2重に「指示」という言葉が出てくる所がややこしい か。「イコール文」というそのまんまの用語はどうかな。みもふ たも無いって感じ。:-)