仅为一个插槽添加值

时间:2015-12-09 01:43:02

标签: arrays ruby immutability

我试图将值添加到数组中的单个插槽。 E.g:

a = Array.new(3,[])    # => [[],[],[]]
a[1] << "value"        # => [[],["value"],[]]

但是,值会被添加到数组中的所有插槽中。

# => [["value"],["value"],["value"]]

这种行为有原因吗?是否有一种标准方法可以向数组添加值以避免此行为?

2 个答案:

答案 0 :(得分:1)

您会看到此行为,因为新数组引用同一个对象。您可以验证查看子阵列的object_id

a = Array.new(3, [])
p a[1] << "value"
p a[0].object_id
# => 70175034559160
p a[1].object_id
# => 70175034559160
p a[2].object_id
# => 70175034559160

你可以这样做:

a = []
(1..3).each { |e| a << [] }
a[1] << "value"
p a
# => [[], ["value"], []]

或者,甚至更好地使用它:

a = Array.new(3) { Array.new }

如评论部分@orde提供的the documentation所示。

答案 1 :(得分:1)

您可以像这样初始化数组,以确保每个元素都有自己的数组:

a = Array.new(3){ Array.new } # or a = Array.new(3){ [] }

而且,是的,正如另一个答案中所述,您正在看到这一点,因为在初始化时,每个元素都分配了相同的数组对象。你所做的与基本相同:

a1 = Array.new
a2 = Array.new(3, a1)

添加值的方式没有任何问题。