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

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

params[:hello] # => ""

params[:hello]が によって変更される理由を誰か説明してもらえgsub!ますか? hello文字列が変更されることを期待していましたが、paramsハッシュは変更されていませんでした。

4

3 に答える 3

6

helloparams[:hello]は同じ文字列への参照です。ruby では (とりわけ Java や python のように) 代入は値をコピーせず、同じ値への別の参照を代入先変数に格納するだけです。そのため、( を使用して) 変更する前に文字列を明示的にコピーしない限り、文字dup列への変更は文字列への他のすべての参照に影響します。

于 2010-02-07T19:15:57.267 に答える
2

利用可能なの2つのバージョンがString#gsubあります

a= "abc" # => "abc"
b= a.gsub("b", "2") # "a2c"
a # => "abc"
c= a.gsub!("c", "3") # => "ab3"
a # => "ab3"

String#gsub!元の文字列を変更し、その文字列への参照を返します。 String#gsubオリジナルを変更せず、コピーを置き換えます。

オブジェクトを。で変更するメソッドに名前を付けるのは、一般的なルビーのイディオム!です。

于 2010-02-07T19:37:35.913 に答える
1

変更したくない場合は、次のように複製する必要があります。

hello = params[:hello].clone

あなたが現在行っている方法では、コピーではなく参照があります。

于 2010-02-07T19:14:45.130 に答える