初始化具有相同元素的数组:`==`运算符表示数组是相同的,但它们的行为不同.为什么?

Lev*_* St 1 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
Run Code Online (Sandbox Code Playgroud)

我得到了我期望的a:

["foobar", "foobar", "foobar"]
Run Code Online (Sandbox Code Playgroud)

但是b,我得到了这个:

["foobarbarbar", "foobarbarbar", "foobarbarbar"]
Run Code Online (Sandbox Code Playgroud)
  1. 为什么会这样?这是一个错误吗?
  2. 有没有一种方法可以使用许多相同的字符串填充数组来避免这个问题?

Ste*_*zyn 7

这不是一个错误,只是线条

a=["foo","foo","foo"]
b=["foo"]*3
Run Code Online (Sandbox Code Playgroud)

不一样.第二种是将SAME OBJECT插入b阵列三次.在a数组中,您有三个不同的对象.在所有情况下,对象都是带有文本"foo"的字符串.

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

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

b[0].object_id == b[1].object_id
=> true
Run Code Online (Sandbox Code Playgroud)

所以当你改变对象的时候<< "bar"你会改变同一个对象三次(在数组的情况下b)

要使用相同字符串的单独实例填充数组,请执行以下操作:

Array.new(3) { "foo" }
Run Code Online (Sandbox Code Playgroud)