ruby - 字符串是 "mutable"是什么意思,为什么要关心?

标签 ruby

我一直在使用 Ruby on Rails 有一段时间没有学习 Ruby,现在我正在学习 Odin 项目。我不太确定这个问题的答案: 字符串是“可变的”是什么意思,为什么要关心?

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

不可变字符串是指内存中的值一旦创建就不能改变,只能改变引用。

基于以下代码的结果:

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 object 而不是更改原始 String 对象的值,这就是对象 id 更改的原因。

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

最佳答案

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

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

在 javascript 等字符串不可变的语言中,str2 的值仍将是 "bar"执行该代码后,如您所见here .但是,在字符串可变的语言中,如 ruby​​,当您附加 "bar" 时在 str1 的末尾(使用 ruby​​ 运算符 << 执行此操作)您实际上是在修改实例,而不是创建新实例,所以 str2也将被修改,如您所见here .

PS: 注意ruby 中在字符串末尾追加 操作符是<<而不是 += (+= 实际上创建了一个新字符串,但不是因为它被迫这样做,就像在 javascript 中一样)。

关于ruby - 字符串是 "mutable"是什么意思,为什么要关心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33686992/

相关文章:

ruby - 如何将正则表达式限制为较小的捕获

ruby - httparty:如何记录请求?

ruby - ruby 中实例和类方法的生命周期回调

ruby-on-rails - 无法运行 Rails 服务器

ruby - 在 os x 上安装 pg 0.15.1 时出错

arrays - 从数组的散列中选择属性中的最大值

ruby - 用鞋子刷新 ruby 堆栈

mysql - 如何将新记录添加到 Rails 控制台上同一模型内创建的另一个表中?

ruby - VagrantFile 内联脚本和 rvm 配置

ruby-on-rails - 在 Rails 模型中动态生成范围