質問

params[:hello] # => "Some params value"

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

params[:hello] # => ""

私はparams[:hello]gsub!によって変更されますなぜ誰かが説明してくださいすることができ、理解していませんか?私はhelloハッシュparams文字列を変更することが予想されるが、ではない。

役に立ちましたか?

解決

helloparams[: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

の方法は、あなたが今それをやっている、あなたはそれへの参照ではなくコピーを持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top