2010-03-01 16 views
83

Para agregar a una cadena existente esto es lo que estoy haciendo.Adjuntar a una cadena existente

s = 'hello' 
s.gsub!(/$/, ' world'); 

Hay una mejor manera de agregar a una cadena existente.

Antes de que alguien sugiere siguiente respuesta Lemme muestran que éste no funciona

s = 'hello' 
s.object_id 
s = s + ' world' 
s.object_id 

En el caso anterior object_id será diferente para los dos casos.

Respuesta

139

Puede usar << para agregar a una cadena en contexto.

s = "foo" 
old_id = s.object_id 
s << "bar" 
s      #=> "foobar" 
s.object_id == old_id #=> true 
+1

¿Cómo está usted s < xxjjnn

+0

@RainbowPony Como mi respuesta muestra, '<<' ya modifica el estado del objeto. Lo mismo ocurre con 'concat'. – sepp2k

+0

No siempre: irb (principal): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Patata") => "Y halo thar! = DPotato" irb (main): 039: 0> widget.notes.where (: author_id => a) .first.message => "Y halo thar! = D" # widget es una instancia de Widget. Puede tener notas. el mensaje es attr_accessible. – xxjjnn

44

también puede utilizar el siguiente:

s.concat("world") 
+0

+1 para la chainable de este método. –

+3

'<<' también debe ser encadenable, ya que devuelve la cadena. – scottyseus

+0

De hecho, y << también es más corto para escribir Y se parece a la variante de C++ cout. << es belleza! – shevy

4

¿Puedo preguntar por qué esto es importante?

Sé que esta no es una respuesta directa a su pregunta, pero el hecho de que esté tratando de conservar el ID del objeto de una cadena podría indicar que debe volver a mirar lo que está tratando de hacer.

Puede encontrar, por ejemplo, que confiar en la identificación del objeto de una cadena dará lugar a errores que son bastante difíciles de rastrear.

+3

¿Quizás para modificar parámetros por referencia? (que es probable un mal diseño en un lenguaje oop completo) – hurikhan77

+4

¿O simplemente para evitar crear demasiados objetos nuevos? Eso es perfectamente razonable. –

+1

Seguramente si modifica una cadena en su lugar y se crea un nuevo objeto, entonces el objeto viejo obtiene la basura recogida? ¿Deberíamos preocuparnos realmente por la cantidad de objetos String que creamos? – Shadowfirebird

0

Sin embargo, otro modo:

s.insert(-1, ' world') 
Cuestiones relacionadas