Agregar a una cadena existente

104

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

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

¿Existe una mejor manera de agregar a una cadena existente?

Antes de que alguien sugiera la siguiente respuesta, déjame mostrar que esta no funciona

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

En el caso anterior, object_id será diferente en dos casos.

Neeraj Singh
fuente

Respuestas:

166

Puede usar <<para agregar a una cadena en el lugar.

s = "foo"
old_id = s.object_id
s << "bar"
s                      #=> "foobar"
s.object_id == old_id  #=> true
sepp2k
fuente
1
¿Cómo lo haces s <<! "barra", como para modificar el estado del objeto? concat! ("bar") no funciona ...
xxjjnn
@RainbowPony Como muestra mi respuesta, <<ya modifica el estado del objeto. También lo hace concat.
sepp2k
No siempre: irb (main): 038: 0> widget.notes.where (: author_id => a) .first.message.concat ("Potato") => "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
1
@RainbowPony Sí, siempre. En su caso, recupera la cadena sin cambios porque widget.notes.where(:author_id => a).firstpresumiblemente devuelve un nuevo objeto cada vez, que tendrá su propia cadena independiente.
sepp2k
¡Ah! Acabo de hacer una nueva pregunta stackoverflow.com/questions/13989619/… ¡ Gracias por la ayuda!
xxjjnn
56

también puede utilizar lo siguiente:

s.concat("world")
Ju Nogueira
fuente
4
<<también debería ser encadenable, ya que devuelve la cadena.
scottysseus
De hecho, y << también es más corto de escribir Y se parece a la variante cout de C ++. << es belleza!
shevy
1
Nota: esto modifica la cadena original. Úselo con cuidado.
Damien Roche
3

¿Puedo preguntar por qué esto es importante?

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

Puede encontrar, por ejemplo, que confiar en el ID de objeto de una cadena dará lugar a errores que son bastante difíciles de rastrear.

Shadowfirebird
fuente
4
¿Quizás modificar parámetros por referencia? (que es probablemente un mal diseño en un lenguaje de oop completo)
hurikhan77
4
¿O simplemente para evitar crear demasiados objetos nuevos? Eso es perfectamente razonable.
James A. Rosen
1
Seguramente, si modifica una cadena en su lugar y se crea un nuevo objeto, ¿el objeto antiguo se recolecta la basura? ¿Deberíamos estar realmente preocupados por la cantidad de objetos String que creamos?
Shadowfirebird
@Shadowfirebird Tal vez esté escribiendo un método que se llama miles de veces por segundo y no quiere atascar su recolector de basura con un montón de cadenas.
Michael Dorst
2

Sin embargo, de otra manera:

s.insert(-1, ' world')
bharat
fuente
1

He aquí otra forma:

fist_segment = "hello,"
second_segment = "world."
complete_string = "#{first_segment} #{second_segment}"
ChuckSaldana
fuente