2009-09-23 11 views
48

En Ruby, ¿cómo puedo copiar una variable de manera que los cambios en el original no afecten a la copia?Ruby: ¿cómo puedo copiar una variable sin señalar el mismo objeto?

Por ejemplo:

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

En este ejemplo, las dos variables apuntan al mismo objeto; Quiero crear un nuevo objeto para la segunda variable pero hacer que contenga la misma información inicialmente.

Respuesta

80

En cuanto a la copia que puede hacer:

phrase2 = phrase1.dup 

o

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

Puede hacerlo así para evitar el copiado en absoluto:

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

clon apunta al mismo objeto en rieles –

16

Usando su ejemplo, en lugar de:

phrase2 = phrase1 

Probar:

phrase2 = phrase1.dup 
+0

Su respuesta trabaja para la pregunta que hice, que era bastante general. Sin embargo, no parece funcionar para el problema que estoy tratando de resolver, que está aquí: http://stackoverflow.com/questions/1465696/ruby-how-can-i-copy-this-global- variable. ¿Algunas ideas? –

+0

Gracias por su ayuda, por cierto. :) –

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

Al responder, brinde una explicación de por qué su solución ayuda. Eso educa a la persona que pregunta para que puedan entender y evitar el problema en el futuro. –

Cuestiones relacionadas