我试图将值添加到数组中的单个插槽。 E.g:
a = Array.new(3,[]) # => [[],[],[]]
a[1] << "value" # => [[],["value"],[]]
但是,值会被添加到数组中的所有插槽中。
# => [["value"],["value"],["value"]]
这种行为有原因吗?是否有一种标准方法可以向数组添加值以避免此行为?
答案 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)
添加值的方式没有任何问题。