params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""我不明白,有没有人能解释一下为什么gsub!会修改params[:hello]?我期望修改的是hello字符串,而不是params散列。
发布于 2010-02-08 03:15:57
hello和params[:hello]是对同一字符串的引用。在ruby (如java和python等)中,赋值不会复制值,它只是在赋值的变量中存储对相同值的另一个引用。因此,除非在修改字符串之前显式复制它(使用dup),否则对该字符串的任何更改都将影响对该字符串的所有其他引用。
发布于 2010-02-08 03:37:36
有两个版本的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不会修改原始文件,而会在副本上进行替换。
给使用!修改对象的方法命名是一种常见的ruby习惯用法。
发布于 2010-02-08 03:14:45
如果你不想修改它,你需要克隆它,如下所示:
hello = params[:hello].clone以你现在的方式,你有一个引用,而不是一个副本。
https://stackoverflow.com/questions/2217917
复制相似问题