2013-03-16 18 views
7

Forse stavo fissando il mio schermo troppo a lungo oggi, ma qualcosa che penso dovrebbe essere molto semplice mi sta bloccando.Come copiare una variabile ruby?

Sto provando a fare una "copia" di una variabile in modo da poterla manipolare senza modificare l'originale.

# original var is set 
foo = ["a","b","c"] 

# i want a copy of the original var so i dont modify the original 
bar = foo 

# modify the copied var 
bar.delete("b") 

# output the values 
puts bar # outputs: ["a","c"] - this is right 
puts foo # outputs: ["a","c"] - why is this also getting modified? 

voglio foo di non essere cambiato.

+0

Non è possibile copiare una variabile. Tutto quello che puoi fare è copiare l'oggetto a cui fa riferimento una variabile. Questo può sembrare pedante, ma non capire la differenza tra un oggetto e una variabile può portare a confusione. –

risposta

11

foo e bar fare riferimento allo stesso oggetto. Per rendere bar si riferiscono ad un oggetto diverso, è necessario clonare foo:

bar = foo.clone 
4

È possibile utilizzare il metodo DUP:

bar = foo.dup 

Ciò restituirà una copia di foo, quindi tutte le modifiche apportate al bar non avrà effetto foo.

3

Nel codice qui sotto si può vedere che foo e bar entrambi stanno avendo lo stesso object_id. Pertanto, passando all'istanza foo, lo stesso riflesso può vedere attraverso lo bar.

foo = ["a","b","c"] 
#=> ["a", "b", "c"] 

foo.object_id 
#=> 16653048 

bar = foo 
#=> ["a", "b", "c"] 

bar.object_id 
#=> 16653048 

bar.delete("b") 
#=> "b" 

puts bar 
#a 
#c 
#=> nil 

puts foo 
#a 
#c 
#=> nil 

Vedi anche qui che ho congelare il foo a tutti gli effetti il ​​bar anche è stato congelato.

foo.freeze 
#=> ["a", "c"] 
foo.frozen? 
#=> true 
bar.frozen? 
#=> true 

Così la strada giusta è qui sotto:

bar = foo.dup 
#=> ["a", "b", "c"] 

foo.object_id 
#=> 16450548 

bar.object_id 
#=> 16765512 

bar.delete("b") 
#=> "b" 

print bar 
#["a", "c"]=> nil 

print foo 
#["a", "b", "c"]=> nil 

Evviva !!

Problemi correlati