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

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

params[:hello] # => ""

我不明白,可以有人请解释为什么params[:hello]得到由gsub!修改?我预期hello字符串进行修改,但不能params散列。

有帮助吗?

解决方案

helloparams[: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

你现在正在做它的方式,你必须对它的引用,而不是一个副本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top