Ruby为数组数组的不同方法提供了不同的结果

时间:2015-12-17 12:58:06

标签: arrays ruby

我试图将一些值附加到数组数组中的特定数组,如下所示:

a1 = [[]] * 2
a1[0] << -1
a1 # => [[-1], [-1]]
a2 = [[], []]
a2[0] << -1
a2 # => [[-1], []]
[[]] * 2 == [[], []] # => true

a2具有预期值,而a1似乎有误。自从我更改a1&amp;之后,我期待[[-1], []]的值为a1[0]不是a1[1]

2 个答案:

答案 0 :(得分:11)

您应该使用:

a1 = Array.new(2) { [] }

[[]]*2用于重复,只是重复同一个对象[]两次。

支持我的上述观点:

a1 = [[]] * 2
a1.map(&:object_id)
#=> [26686760, 26686760]   # same object ids

a3 = Array.new(2) { [] }
a3.map(&:object_id)
#=> [23154760, 23154680]   # different object ids

答案 1 :(得分:2)

a1中的两个子数组都是相同的Array对象。