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

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

params[:hello] # => ""

我不明白,有人可以解释一下为什么params[:hello]会被修改gsub!吗?我希望hello字符串被修改,但不是params哈希。

4

3 回答 3

6

hello并且params[:hello]是对相同字符串的引用。在 ruby​​ 中(如在 java 和 python 等中)赋值不会复制值,它只是在赋值变量中存储对相同值的另一个引用。因此,除非您在修改(使用dup)之前显式复制字符串,否则对字符串的任何更改都会影响对字符串的所有其他引用。

于 2010-02-07T19:15:57.267 回答
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 回答