字符串是什么意思"可变"为什么要关心?

时间:2015-11-13 06:20:55

标签: ruby

我一直在使用Ruby on Rails而不学习Ruby,现在我正在使用Odin Project。我不确定这个问题的答案: 字符串是什么意思"可变"为什么要关心?

更新: 所以现在我理解可变字符串基本上意味着在创建字符串后可以更改内存中的值。

不可变字符串表示一旦创建就无法更改内存中的值,只能更改引用。

基于以下代码的结果:

a = "foo"
a.object_id
 => 70218039369160
b = "bar"
a << b
 => "foobar"
a.object_id
 => 70218039369160

我可以说Ruby中的字符串是可变的吗?因为同一内存中的值已更改

a += b
 => "foobar"
a.object_id
 => 70218039184800

并且Ruby中的+方法实际上创建了一个新的String对象,而不是更改原始String对象的值,这就是对象id更改的原因。

我的问题是,如果我可以互换地使用+=<<会导致任何安全问题吗?

1 个答案:

答案 0 :(得分:1)

这意味着您可以修改字符串的现有实例,而无需构建新字符串。请考虑以下代码:

str1 = "foo"
str2 = str1
str1 += "bar"

在javascript这样的语言中,字符串是不可变的,执行该代码后str2的值仍为"bar",如您所见here。但是,在字符串可变的语言中,比如ruby,当你在"bar"末尾追加str1时(使用执行该操作的ruby运算符<<),实际上是在修改实例,如果没有创建新的,str2也会被修改,您可以看到here

PS:请注意,ruby中字符串运算符末尾的附加<<而不是+=+=实际上会创建一个新字符串,但不是因为它被迫这样做,就像在javascript中一样。)