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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top