Domanda
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
Non capisco, qualcuno può spiegare perché il params[:hello]
viene modificato dal gsub!
? Mi aspettavo la stringa hello
da modificare, ma non l'hash params
.
Soluzione
hello
e params[:hello]
sono riferimenti alla stessa stringa. In rubino (come in Java e pitone tra gli altri) assegnazione non copia il valore, solo memorizza un altro riferimento allo stesso valore nel assigned-to variabile. Quindi, a meno di copiare in modo esplicito la stringa prima di modificarlo (usando dup
) eventuali modifiche alla stringa interesserà tutti gli altri riferimenti alla stringa.
Altri suggerimenti
Ci sono due versioni di String#gsub
disponibili
a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"
String#gsub!
modifica la stringa originale e restituisce un riferimento ad esso.
String#gsub
non modifica l'originale e rende la sostituzione su una copia.
È un rubino linguaggio comune a metodi nomi che modificano l'oggetto con un !
.
Se non si desidera che venga modificato, è necessario clonarlo, come:
hello = params[:hello].clone
Il modo in cui si sta facendo ora, avete un riferimento ad esso, non una copia.