2009-09-23 8 views
48

In Ruby, come posso copiare una variabile in modo che le modifiche apportate all'originale non influiscano sulla copia?Ruby: come posso copiare una variabile senza puntare allo stesso oggetto?

Ad esempio:

phrase1 = "Hello Jim" 
phrase2 = phrase1 
phrase1.gsub!("Hello","Hi") 
p phrase2 #outputs "Hi Jim" - I want it to remain "Hello Jim" 

In questo esempio, i due variabili puntano allo stesso oggetto; Voglio creare un nuovo oggetto per la seconda variabile ma averlo inizialmente contenente le stesse informazioni.

risposta

80

Per quanto riguarda la copia si può fare:

phrase2 = phrase1.dup 

o

# Clone: copies singleton methods as well 
phrase2 = phrase1.clone 

Si può fare questo anche per evitare di copiare a tutti:

phrase2 = phrase1.gsub("Hello","Hi") 
+0

punti clonazione per lo stesso oggetto in rotaie –

16

Usando il tuo esempio, invece di:

phrase2 = phrase1 

Prova:

phrase2 = phrase1.dup 
+0

La tua risposta lavora per la domanda ho chiesto, che era abbastanza generale. Non sembra funzionare per il problema che sto davvero cercando di risolvere, che è qui: http://stackoverflow.com/questions/1465696/ruby-how-can-i-copy-this-global- variabile. Qualche idea? –

+0

Grazie per il tuo aiuto, a proposito. :) –

0
phrase1 = "Hello Jim" 
    # => "Hello Jim" 

phrase2 = Marshal.load(Marshal.dump(phrase1)) 
    # => "Hello Jim" 

phrase1.gsub!("Hello","Hi") 
    # => "Hi Jim" 

puts phrase2 
    # "Hello Jim" 

puts phrase1 
    # "Hi Jim" 
+6

Quando si risponde, fornire una spiegazione perché la soluzione aiuta. Questo educa la persona a chiedere in modo che possano capire ed evitare il problema in futuro. –

Problemi correlati