7

ハッシュ値を出力するときの順序の参照として使用する値の配列があります。配列の値が「きれい」になるように配列を変更したいと思います。配列を複製または複製し、値を変更すると、元のオブジェクトは変更されないままになると考えました。しかし(irbで)...

@arr = ['stuff', 'things']
a = @arr.clone
b = @arr.dup

したがって、少なくとも a と @arr は異なるオブジェクトです。

a.object_id == @arr.object_id
=> false

しかし、今では奇妙になります

a[0].capitalize!
a
=> ['Stuff', 'things']
@arr
=> ['Stuff', 'things'] ##<-what?
b
=> ['Stuff', 'things']## <-what???

わかりました... 1 つを変更すると他のものが変更されます。元に戻しますか?

a[0] = 'stuff'
a
=> ['stuff', 'things']
@arr
=> ['Stuff', 'things'] ## <- WHAT?????

完全を期すために b[1].capitalize! 同じ効果があり、3 つの配列の 2 番目の位置をすべて大文字にします

それで...大文字の最後の強打はそれをさらに強力にしますか? 他のオブジェクトにクロスオーバーするのに十分ですか?? これを行う他の方法は知っていますが、これは私には非常に奇妙に思えました。これは「浅いコピー」であることと関係があると思います。これを行うための最良の方法に関する提案はありますか?

4

1 に答える 1

8

dup配列の新しいインスタンスをclone作成しますが、コンテンツのインスタンスは作成しません。これはディープ コピーではありません。

見る:

array0 = ['stuff', 'things']
array1 = array0.clone
array2 = array0.dup

puts "Array-Ids"
p array0.object_id
p array1.object_id
p array2.object_id

puts "Object ids"
array0.each_with_index{|_,i|
  p array0[i].object_id
  p array1[i].object_id
  p array2[i].object_id
  p '--------'
}

配列内の要素は同じ object_id を共有します - それらは同じオブジェクトです。配列には異なるオブジェクト ID があります。

a[0].capitalize!3 つの異なる配列の一部であるオブジェクトを変更する場合。

こちらもご覧ください

于 2012-09-19T21:04:51.663 に答える