- 429 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 08:32:04 ]
- 初心者スレだったんだっけ
>>426 オブジェクトを「捕まえる」「入れておく」ことはできない 名前で参照するしかない 変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない irb> a = [1, 2] irb> b = a irb> a << 3 irb> p (a.object_id == b.object_id) true で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい irb> a = [1, 2, 3, 4, 5] irb> p (a[0..2].object_id == a.object_id) false a と a[0..2] は違うオブジェクトなので、 [1, 2, 3, 4, 5] と [1, 2, 3] ← a[0..2] が返す、できたてほやほや配列 という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は [1, 2, 3, 4, 5] <共有済> と <注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する> という、1つの「share された」配列と1つの「share した」配列になってる これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する 通知または破壊的変更がきた場合の動作は ・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける) ・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える ということである、というようなてきとーな理解でいいか>>421 array.c を読めばなんか書いてあるのかね
|

|