params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
我不明白,请问有人能解释为什么params[:hello]
被gsub!
修改?我期望hello
字符串被修改,但不是params
哈希。关于Ruby Gsub
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
我不明白,请问有人能解释为什么params[:hello]
被gsub!
修改?我期望hello
字符串被修改,但不是params
哈希。关于Ruby Gsub
hello
和params[:hello]
是对相同字符串的引用。在ruby中(如java和python等)赋值不会复制值,它只是在赋值变量中存储对同一值的另一个引用。因此,除非您在修改该字符串之前明确复制该字符串(使用dup
),否则对该字符串的任何更改都会影响对该字符串的所有其他引用。
如果你不希望它被修改时,你需要克隆它,如:
hello = params[:hello].clone
你现在正在做它的方式,你必须对它的引用,而不是一个副本。
还有的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
不会修改原件并在副本上进行替换。
这是一个常见的红宝石成语,用于命名用!
修改对象的方法。