题
params[:hello] # => "Some params value"
hello = params[:hello]
hello.gsub!("whatever","")
params[:hello] # => ""
我不明白,可以有人请解释为什么params[:hello]
得到由gsub!
修改?我预期hello
字符串进行修改,但不能params
散列。
解决方案
和hello
是params[:hello]
到相同的字符串的引用。在红宝石(如在其他Java和Python)分配不复制的价值,它只是存储在另一个参照相同的值分配到变量。所以,除非你明确地修改它之前复制的字符串(使用dup
)字符串的任何变化都会影响到字符串的所有其他引用。
其他提示
有可用的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
你现在正在做它的方式,你必须对它的引用,而不是一个副本。
不隶属于 StackOverflow