2017-02-06 1 views
0

Beachten Sie Folgendes:Wie kann ich ein Array ändern, ohne ein ihm zugewiesenes Array zu zerstören?

array1 = [1, 2, 3, 4] 
array2 = array1 # => [1, 2, 3, 4] 
array2.pop 
array2 # => [1, 2, 3] 
array1 # => [1, 2, 3] 

Warum array1 zerstört, wenn ich nur pop auf array2 genannt haben? Gibt es eine Möglichkeit, pop den letzten Wert von array2 und array1 intakt zu lassen, so dass ich array1 # => [1, 2, 3, 4] bekomme?

+1

Was bedeutet ' array1.object_id' und 'array2.object_id' return? –

Antwort

4

Es ist ein Alias-Problem. Ihre Referenzen zeigen auf dasselbe Array-Objekt im Speicher. Wenn Ihre Arrays einfache Ganzzahlen wie die dup Methode enthalten, machen Sie den Trick.

array2 = array1.dup 
1

array2 = array1.dup


array2 = array1.clone => Ihre Änderungen Effekte beide Arrays

+0

Dies ist falsch oder zumindest irreführend. Sowohl "dup" als auch "clone" erzeugen unabhängige Objekte, und spätere Änderungen wirken sich nicht auf die andere aus. Die einzigen zwei Unterschiede zwischen Klon und Dup ist, dass der Klon die Singleton-Klasse des Originals kopiert, während dup nicht, und das Klonen eines eingefrorenen Objekts zu einem eingefrorenen Klon führt, während ein Dup niemals eingefroren wird. – philomory

0

Ich ziehe Object#dup Methode, aber hier ist eine weitere Option FYI:

> array1 = [1, 2, 3, 4] 
#=> [1, 2, 3, 4] 
> array2 = Array.new + array1 
#=> [1, 2, 3, 4] 
> array1.object_id 
#=> 87422520 
> array2.object_id 
#=> 87400390 
Verwandte Themen