2010-02-07 6 views
1
params[:hello] # => "Some params value" 

hello = params[:hello] 
hello.gsub!("whatever","") 

params[:hello] # => "" 

Je ne comprends pas, quelqu'un peut-il s'il vous plaît expliquer pourquoi la params[:hello] se modifie par le gsub!? Je m'attendais à ce que la chaîne hello soit modifiée, mais pas le hachage params.À propos de Ruby gsub

Répondre

6

hello et params[:hello] sont des références à la même chaîne. Dans ruby ​​(comme dans java et python entre autres), l'affectation ne copie pas la valeur, elle stocke simplement une autre référence à la même valeur dans la variable assignée. Donc, sauf si vous copiez explicitement la chaîne avant de la modifier (en utilisant dup), toute modification apportée à la chaîne affectera toutes les autres références à la chaîne.

1

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.

2

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 change rien à l'original et fait le remplacement sur une copie.

C'est un idiome commun de rubis pour nommer des méthodes qui modifient l'objet avec !.