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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top