这是我的代码:
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"]
- 为什么会这样?是错误吗?
- 有没有办法用许多相同的字符串填充一个数组来避免这个问题?
最佳答案
这不是错误,只是线条
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/