質問
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
私はparams[:hello]
がgsub!
によって変更されますなぜ誰かが説明してくださいすることができ、理解していませんか?私はhello
ハッシュparams
文字列を変更することが予想されるが、ではない。
解決
hello
とparams[:hello]
は、同じ文字列への参照です。ルビーの値をコピーしない(特にJavaとPythonのように)割り当ては、それだけで同じ値に別の参照を格納する割り当て-可変。だから、あなたが明示的に(dup
を使用して)、それを変更する前に文字列をコピーしない限り、文字列への変更は、文字列に他のすべての参照に影響します。
他のヒント
タグ利用可能
String#gsub
の2つのバージョンがあります。
a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"
String#gsub!
は、元の文字列を変更し、それへの参照を返します。
String#gsub
は、元を変更し、コピーの交換を行いません。
これは!
でオブジェクトを変更する名前のメソッドに共通のルビーイディオムです。
あなたはそれを変更したくない場合のように、あなたは、それのクローンを作成する必要があります:
hello = params[:hello].clone
の方法は、あなたが今それをやっている、あなたはそれへの参照ではなくコピーを持っています。
所属していません StackOverflow