ruby - 用相同的元素 : `==` operator says arrays are the same, 初始化一个数组,但它们的行为不同。为什么?

标签 ruby immutability

这是我的代码:

a=["foo","foo","foo"]
b=["foo"]*3
a==b # => true

a.each{|i| i<<"bar"}
b.each{|i| i<<"bar"}
a==b # => false

我得到了我对 a 的期望:

["foobar", "foobar", "foobar"]

但是对于 b,我得到这个:

["foobarbarbar", "foobarbarbar", "foobarbarbar"]
  1. 为什么会这样?是错误吗?
  2. 有没有办法用许多相同的字符串填充一个数组来避免这个问题?

最佳答案

这不是错误,只是线条

a=["foo","foo","foo"]
b=["foo"]*3

不一样。第二个是将 SAME OBJECT 三次插入到 b 中。大批。在a阵列,你有三个不同的对象。在所有情况下,对象都是带有文本“foo”的字符串。

您可以通过检查对象 ID 来确认这一点。

a[0].object_id == a[1].object_id
=> false

b[0].object_id == b[1].object_id
=> true

因此,当您使用 << "bar" 改变对象时你正在改变同一个对象三次(在数组 b 的情况下)

要用相同字符串的不同实例填充数组,请执行...

Array.new(3) { "foo" }

关于ruby - 用相同的元素 : `==` operator says arrays are the same, 初始化一个数组,但它们的行为不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636977/

相关文章:

ruby - Haml "Illegal Nesting"问题;如何在同一个标​​签中放置多个代码元素?

ruby-on-rails - 使用 state_machine 进行条件验证

java - Java 字符串是如何工作的

java - 字符串可以重写吗?

inheritance - 如何在@Immutable 类中设置父类(super class)属性?

ruby-on-rails - 如何获取/追溯方法调用堆栈

ruby-on-rails - 使用 Windows 7(无 rvm)无法在任何来源(Bundler::GemNotFound)中找到 rake-0.9.2.2

c - 如何修改这个顺序网络程序以获得更好的性能?

c# - 如何防止序列化后序列化类发生变化

javascript - 不可变地更新对象数组并管理长度缩减