Pregunta
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
No entiendo, por favor alguien puede explicar por qué el params[:hello]
es modificado por el gsub!
? Yo esperaba que la cadena hello
a ser modificado, pero no el hash params
.
Solución
hello
y params[:hello]
son referencias a la misma cadena. En Ruby asignación (como en Java y Python, entre otros) no copiar el valor, sino que almacena otra referencia al mismo valor en el asignado a la variable. Así que a menos que copie de forma explícita la cadena antes de modificarlo (usando dup
) cualquier cambio en la cadena afectará a todas las demás referencias a la cadena.
Otros consejos
Hay dos versiones de String#gsub
disponibles
a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"
String#gsub!
modifica la cadena original y devuelve una referencia a él.
String#gsub
no modifica el original y hace que la sustitución de una copia.
Es un lenguaje rubí común a los métodos de nombres que modifican el objeto con un !
.
Si no desea que se modifica, es necesario clonarlo, como:
hello = params[:hello].clone
La forma en que lo está haciendo ahora, que tiene una referencia a él, no una copia.