2010-01-16 8 views
15

Veo una gran cantidad de este tipo de esta pasando en Rubí:¿Cómo se << difiere de +?

myString = "Hello " << "there!" 

¿Cómo es esto diferente de hacer

myString = "Hello " + "there!" 

Respuesta

25

En Ruby, cuerdas son mutables. Es decir, un valor de cadena puede cambiarse, no reemplazarse con otro objeto. x << y realmente agregará la cadena y a x, mientras que x + y creará una nueva Cadena y la devolverá.

Esto se puede comprobar simplemente en el intérprete de Ruby:

irb(main):001:0> x = "hello" 
=> "hello" 
irb(main):002:0> x << "there" 
=> "hellothere" 
irb(main):003:0> x 
=> "hellothere" 
irb(main):004:0> x + "there" 
=> "hellotherethere" 
irb(main):005:0> x 
=> "hellothere" 

En particular, vemos que x + "there" regresaron "hellotherethere" pero el valor de x se mantuvo sin cambios. Tenga cuidado con las cuerdas mutables, pueden venir y morderlo. La mayoría de los otros lenguajes administrados no tienen cadenas mutables.

Tenga en cuenta también que muchos de los métodos en cadena tiene versiones tanto destructivos y no destructivos: x.upcase devolverá una nueva cadena que contiene la versión mayúscula de x, x, dejando solo; x.upcase! devolverá el valor de mayúscula -y- modificará el objeto apuntado por x.

+1

Una excelente explicación. x = "Muchos"; x << "¡gracias!" –

+4

BTW: Esto también se aplica a la mayoría de los otros objetos de colección en Ruby. 'Array # <<' se agrega al mutar, 'Array # +' se agrega al crear una nueva matriz. 'Set # <<' está agregando un elemento al conjunto, 'Set # +' es set union. Y así. –