修改二维数组ruby

时间:2015-10-07 15:32:00

标签: ruby

如果我创建这个数组:

a = Array.new(3,Array.new(2,0))

它创建:

=> [[0, 0], [0, 0], [0, 0]]

当我尝试更改特定元素时:

a[0][0] = 3

它改变了多个值:

 => [[3, 0], [3, 0], [3, 0]]

为什么会这样?我怎样才能更改特定元素?

2 个答案:

答案 0 :(得分:6)

您必须更改将阵列(this is a known issue)初始化为此的方式:

a = Array.new(3) { Array.new(2,0) }

您的版本与此版本之间的区别在于Array.new(2,0)仅出现一次。你正在用3"指针创建一个数组"到第二个数组。您可以在以下代码中看到此内容:

a = Array.new(3,Array.new(2,0))
a.map { |a| a.object_id }
#=> [70246027840960, 70246027840960, 70246027840960] # Same object ids!

a = Array.new(3) { Array.new(2,0) }
a.map { |a| a.object_id }
#=> [70246028007600, 70246028007580, 70246028007560] # Different object ids

答案 1 :(得分:4)

您可能需要参考this

Array.new(3,Array.new(2,0))可以分两步理解 -

  1. 创建了一个新数组Array.new(2,0)

  2. 再次创建一个新数组,其中3个元素在所有3个位置具有相同的对象(1)。

  3. 因此,更改任何子数组中的值会更改其中每个子数组的值。子数组指的是同一个对象。

    正如Gavin Miller指出的那样,您需要使用a = Array.new(3) { Array.new(2,0) }来更改每个元素。