Pergunta
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
Eu não entendo, alguém por favor pode explicar por que o params[:hello]
fica modificado pela gsub!
? Eu esperava que a corda hello
a ser modificado, mas não o hash params
.
Solução
hello
e params[:hello]
são referências para a mesma cadeia. Em Ruby (como em Java e Python, entre outros) cessão não copia o valor, ele só armazena uma outra referência para o mesmo valor na atribuída-to variável. Então, se você copiar explicitamente a cadeia antes de modificá-lo (usando dup
) quaisquer alterações ao texto irá afetar todas as outras referências à string.
Outras dicas
Existem duas versões do String#gsub
disponível
a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"
modifica String#gsub!
a string original e retorna uma referência a ele.
String#gsub
não modifica o original e faz a substituição de uma cópia.
É um idioma rubi comum a métodos de nomes que modificam o objeto com um !
.
Se você não quer que ele seja modificado, é preciso cloná-lo, como:
hello = params[:hello].clone
A maneira como você está fazendo isso agora, você tem uma referência a ele, não uma cópia.