From: EGUCHI Osamu Date: 1999-11-01T17:57:41+09:00 Subject: [ruby-dev:8189] Re: {literal}#[]= えぐち@エスアンドイー です。 >>> In message [ruby-dev:8185] Re: {literal}#[]= On Mon, 1 Nov 1999 17:02:07 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) said: matz> まつもと ゆきひろです matz> matz> matz> In message "[ruby-dev:8183] Re: {literal}#[]=" matz> on 99/11/01, EGUCHI Osamu writes: matz> |ここで良く分からないのが、 matz> | matz> | + なぜ数だけが immutable か? matz> | matz> |と言う点で、実装が内部的には Fixnum#dup 相当 matz> |になってい事を隠蔽する意図ででしょうか? matz> | matz> | a = b = 4 matz> | a[1] = 1 matz> | p [a, b] matz> | => [5, 5] matz> | matz> |と Ruby 的には本来なるはずだと言う理解であっていますか? matz> |#もし Fixnum が mutable だとして。 matz> matz> そうです。もし仮にこれができたとすると、それ以降のRubyスクリ matz> プトでは4が登場すべき局面で実際には5が現れるわけですよね。な matz> んかすごくイヤじゃありません? かなりイヤですね。 ただ全部の 4 が 5 に化けるというか、 b の様な aliasing が起こるとこだけだと思います。 # イヤ度はおなじですが。 matz> あるいは「この4だけが5になる」という実装も可能でしょうが、そ matz> れは非常に大きなパフォーマンスペナルティの源なので、避けたい matz> です。BignumやFloatではそのようなことが実装上可能ですが、将 matz> 来変更しないとは限らないので、そのような実装を強制するような matz> 仕様を採用したくありません。 ペナルティって代入のタイミングで生じる dup の事ですか? matz> |Array#[]= は「指してる先」(である Array の)参照関係を matz> |変化させているようにも考えれれますが、、私の眼(マナコ)が曇っているだけ? matz> matz> 指してる先のオブジェクトの内容が変化するのは大丈夫なのです。 matz> 指してる先を変えることができないんです。 「(メソッドからは)指してる先を変えることができない」 って今はじめて知覚しました。 #う゛、眼(マナコ)曇ってたです。 matz> | 結局、『 ++ 演算子の議論』の変種って事ですね。 matz> matz> そういうことですね。Array#replaceはメソッドで実現できるが、 matz> 代入はメソッドで実現できないということです。 代入がメソッドでないってそういう意味だったんですね。 えぐち