¿Son las cuerdas en Ruby mutable?

Considere el siguiente código:

$ irb > s = "asd" > s.object_id # prints 2171223360 > s[0] = ?z # s is now "zsd" > s.object_id # prints 2171223360 (same as before) > s += "hello" # s is now "zsdhello" > s.object_id # prints 2171224560 (now it's different) 

Parece que los caracteres individuales se pueden cambiar sin crear una nueva cadena. Sin embargo, al agregar a la cadena aparentemente se crea una nueva cadena.

¿Son las cuerdas en Ruby mutable?

Sí, las cadenas en Ruby, a diferencia de Python, son mutables.

s += "hello" no agrega "hello" a s : se crea un objeto de cadena completamente nuevo. Para adjuntar a una cadena ‘en su lugar’, use << , como en:

 s = "hello" s << " world" s # hello world 
 ruby-1.9.3-p0 :026 > s="foo" => "foo" ruby-1.9.3-p0 :027 > s.object_id => 70120944881780 ruby-1.9.3-p0 :028 > s<<"bar" => "foobar" ruby-1.9.3-p0 :029 > s.object_id => 70120944881780 ruby-1.9.3-p0 :031 > s+="xxx" => "foobarxxx" ruby-1.9.3-p0 :032 > s.object_id => 70120961479860 

así, las cadenas son mutables, pero el operador += crea una nueva cadena. << mantiene viejo

Agregar en Ruby String no es += , es <<

Así que si cambias += a << tu pregunta se resuelve por sí sola

Las cuerdas en Ruby son mutables, pero puedes cambiarlas con congelación.

 irb(main):001:0> s = "foo".freeze => "foo" irb(main):002:0> s << "bar" RuntimeError: can't modify frozen String 

Las cuerdas de Ruby son mutables. Pero necesitas usar << para concatenación en lugar de +.
De hecho concatenando cuerdas con
Operador + (inmutable) porque crea un nuevo objeto de cadena.
<< operador (mutable) porque cambia en el mismo objeto.

Por lo que puedo hacer de esta solicitud de extracción , será posible en Ruby 3.0 agregar un “comentario mágico” que hará que toda la cadena sea inmutable , en lugar de mutable.

Debido a que parece que tiene que agregar explícitamente este comentario, parece que la respuesta a “¿se puede mutar la cadena de forma predeterminada ?” seguirá siendo sí, pero un tipo de condicional sí, depende de si escribió el comentario mágico en su script o no.

EDITAR

Me apuntaron a este error / problema en Ruby-Lang.org que definitivamente declara que algún tipo de cadenas en Ruby 3.0 de hecho será inmutable por defecto.

    Intereting Posts