2016-05-03 3 views
0

Ich führe Operationen auf Arrays und ich bin in einigen Problemen. Ich habe array_1 dupliziert zu array_2 zugewiesen. Wenn ich Operationen auf Array_2 durchgeführt habe, ändert die uniq Methode das ursprüngliche Array.Ruby 2.3: Kann ein Array nicht duplizieren. Original-Array geändert

array_3 ist, was ich erreichen sollte, aber ich verstehe nicht, warum die Operationen dort erhalten modifizierten array_1

Ich brauche eine Erklärung, warum dieses Verhalten auftritt, und was kann ich tun, dies zu verhindern.

array_1 = [["Ed","2",],["Ann","2"],["Sue","2"],["Ed","3",],["Ann","3"],["Sue","3"]] 

array_2 = array_1.dup 
array_2 = array_2.uniq(&:first) 

array_3=[] 
array_2.each do |a2| 
    a2.pop 
    array_3.push(a2) 
end 

puts array_3 
=> [["Ed"], ["Ann"], ["Sue"]] 

puts array_1 
=> [["Ed"], ["Ann"], ["Sue"], ["Ed", "3"], ["Ann", "3"], ["Sue", "3"]] 
+0

http://ruby.about.com/od/advancedruby/a/deepcopy.htm – matt

Antwort

3

Das Problem ist, diese Zeile:

array_2 = array_1.dup 

Aus der Dokumentation:

dup

Erzeugt eine flache Kopie von obj-die Instanzvariablen von obj sind kopiert, aber nicht die Objekte, auf die sie verweisen.

So array_2 besteht aus Zeigern auf den gleichen Sub-Arrays, die in array_1 sind. Jetzt mutiert pop sein Array. Wenn Sie also pop ein Unterfeld in array_2, betrifft es das gleiche Unterfeld in array_1.

Sie finden das Ergebnis erhalten Sie scheinen zu erwarten, wenn Sie sagen

array_2 = array_1.map(&:dup) 

persönlich, obwohl, würde ich

ändern
a2.pop 
array_3.push(a2) 

zu

array_3.push(a2[0]) 

ich nicht Sehen Sie, was Sie gewinnen, indem Sie die Subarrays mutieren (obwohl vielleicht etwas vor sich geht, was Sie uns nicht gesagt haben).

+0

Bitte rate den Leuten nicht, 'Marshal.load (Marshal.dump (array_1))' 'zu tun, oder erwähne das zumindest es ist fast immer die falsche Lösung. In diesem Fall würde 'array_1.map (&: dup)' ausreichen. –

+0

Einverstanden, danke. – matt

+0

Dies ist Teil eines größeren Programms. Ich muss die Sub-Arrays intakt halten. Ich benutze diese Beispiele, um das Innenleben von Ruby zu lernen, wenn ein Problem mich stopft – ctilley79