params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
params[:hello]
が によって変更される理由を誰か説明してもらえgsub!
ますか? hello
文字列が変更されることを期待していましたが、params
ハッシュは変更されていませんでした。
hello
とparams[:hello]
は同じ文字列への参照です。ruby では (とりわけ Java や python のように) 代入は値をコピーせず、同じ値への別の参照を代入先変数に格納するだけです。そのため、( を使用して) 変更する前に文字列を明示的にコピーしない限り、文字dup
列への変更は文字列への他のすべての参照に影響します。
利用可能なの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
オリジナルを変更せず、コピーを置き換えます。
オブジェクトを。で変更するメソッドに名前を付けるのは、一般的なルビーのイディオム!
です。
変更したくない場合は、次のように複製する必要があります。
hello = params[:hello].clone
あなたが現在行っている方法では、コピーではなく参照があります。