2017-05-01 5 views
0

私はvar配列を持っています。ある変数を別の変数にコピーして、それらを互いに独立させる方法

arrays = [[15, 2, 3], [9, 1, 2], [5, 3, 0]] 

新しいvarソートにコピーします。期待される結果は、私はvarが

sorted_clone = arrays.clone 

sorted_clone.each do |i| 
    i.sort! 
end 

p arrays 
p sorted_clone 

VAR配列を変更せずにソートソートすることはできません

[[15, 2, 3], [9, 1, 2], [5, 3, 0]] 
[[2, 3, 15], [1, 2, 9], [0, 3, 5]] 

である私はまた、両方のための結果は

同じである

arrays = [[15, 2, 3], [9, 1, 2], [5, 3, 0]] 

sorted_dup = arrays.dup 

sorted_dup.each do |i| 
    i.sort! 
end 

p arrays 
p sorted_dup 

を試してみました

[[2, 3, 15], [1, 2, 9], [0, 3, 5]] 
[[2, 3, 15], [1, 2, 9], [0, 3, 5]] 
+0

'map'と、おそらく新しい割り当てを使用してください。 –

+1

オブジェクト「obj0」の「ディープ・コピー」「obj1」は、「obj1」への変更が「obj0」を変更しないという特性を有する。 @ Jokesterの答えが示すように、配列の配列の深いコピーを作ることはかなり簡単です。しかし、配列やハッシュの複数レベルのネストがある場合など、複雑なオブジェクト 'obj0'のディープコピーを作成する必要があることがあります。 (Marshal)(https://ruby-doc.org/core-2.4.0/Marshal.html)モジュールのメソッドを使用することです:obj1 = Marshal.load(Marshal .dump(obj0)) 'を実行します。 –

答えて

3

一方的なやり方ですeレベルより深いクローン、すなわち重複した子アイテムも含む。

arrays = [[15, 2, 3], [9, 1, 2], [5, 3, 0]] 

sorted_clone = arrays.map {|item| item.clone} 

sorted_clone.each do |i| 
    i.sort! 
end 

p arrays 
p sorted_clone 

別の方法ではなく、既存のものを変異させる、新しいオブジェクトを作成することです:

arrays = [[15, 2, 3], [9, 1, 2], [5, 3, 0]] 

# #sort method is the not-modifying-in-place version of #sort! 
sorted_clone = arrays.map {|child| child.sort } 

p arrays 
p sorted_clone 
+0

ありがとう、それは動作します – Dara

関連する問題