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