Question
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
Je ne comprends pas, quelqu'un peut-il expliquer pourquoi l' params[:hello]
obtient modifié par le gsub!
?Je m'attendais à la hello
chaîne à être modifié, mais pas le params
de hachage.
La solution
hello
et params[:hello]
sont des références à la même chaîne.En ruby (comme en java et python entre autres) attribution de ne pas copier la valeur, il vient de magasins d'une autre référence à la même valeur affectée à la variable.Donc, sauf si vous explicitement copier la chaîne avant de le modifier (à l'aide de dup
) toute modification de la chaîne va affecter tous les autres références à la chaîne.
Autres conseils
Il existe deux versions 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!
modifie la chaîne d'origine et retourne une référence.
String#gsub
ne modifie pas l'original et fait le remplacement sur une copie.
Il est un idiome rubis commun aux méthodes de noms qui modifient l'objet avec un !
.
Si vous ne voulez pas qu'il soit modifié, vous devez cloner, comme:
hello = params[:hello].clone
La façon dont vous faites maintenant, vous avez une référence à, non pas une copie.