2011-04-16 22 views
27

¿Las cadenas se pueden mutar en Ruby? De acuerdo con la documentation haciendo¿Las cadenas se pueden mutar en Ruby?

str = "hello" 
str = str + " world" 

crea un nuevo objeto cadena con el valor "hello world" pero cuando lo hacemos

str = "hello" 
str << " world" 

No menciona que crea un nuevo objeto, por lo que no es mutar el objeto str , que ahora tendrá el valor "hello world"?

Respuesta

62

Sí, << muta el mismo objeto y + crea uno nuevo. Demostración:

irb(main):011:0> str = "hello" 
=> "hello" 
irb(main):012:0> str.object_id 
=> 22269036 
irb(main):013:0> str << " world" 
=> "hello world" 
irb(main):014:0> str.object_id 
=> 22269036 
irb(main):015:0> str = str + " world" 
=> "hello world world" 
irb(main):016:0> str.object_id 
=> 21462360 
irb(main):017:0> 
+3

+1 para demostrar cómo determinar si los objetos son de hecho iguales o diferentes – Cumbayah

7

Sólo para complementar, una de las implicaciones de esta mutabilidad es parece a continuación:

ruby-1.9.2-p0 :001 > str = "foo" 
=> "foo" 
ruby-1.9.2-p0 :002 > ref = str 
=> "foo" 
ruby-1.9.2-p0 :003 > str = str + "bar" 
=> "foobar" 
ruby-1.9.2-p0 :004 > str 
=> "foobar" 
ruby-1.9.2-p0 :005 > ref 
=> "foo" 

y

ruby-1.9.2-p0 :001 > str = "foo" 
=> "foo" 
ruby-1.9.2-p0 :002 > ref = str 
=> "foo" 
ruby-1.9.2-p0 :003 > str << "bar" 
=> "foobar" 
ruby-1.9.2-p0 :004 > str 
=> "foobar" 
ruby-1.9.2-p0 :005 > ref 
=> "foobar" 

Por lo tanto, usted debe elegir sabiamente los métodos que utiliza con cuerdas de para evitar comportamientos inesperados.

Además, si quieres algo inmutable y único en toda la aplicación hay que ir con símbolos:

ruby-1.9.2-p0 :001 > "foo" == "foo" 
=> true 
ruby-1.9.2-p0 :002 > "foo".object_id == "foo".object_id 
=> false 
ruby-1.9.2-p0 :003 > :foo == :foo 
=> true 
ruby-1.9.2-p0 :004 > :foo.object_id == :foo.object_id 
=> true 
Cuestiones relacionadas