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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top