将数字推入矩阵数组

时间:2018-05-31 02:42:08

标签: arrays ruby

我做了:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = Array.new(matrix[0].length, [])
result[0] << 2
result # [[2], [2], [2]]

我不明白为什么2出现在我的所有子阵列中。我怎样才能进入第一个子阵列?

def transpose(matrix)
  debugger
  result = Array.new(matrix[0].length, []) #HARD - PASS BY REFERENCE ISSUE
  matrix.each do |row|
    row.each_with_index do |el, col_idx|
      result[col_idx] << el
    end
  end
  result
end

2 个答案:

答案 0 :(得分:2)

正如文件所说:

  

也可以通过显式调用:: new来创建数组,   一个(数组的初始大小)或两个参数(初始大小   和一个默认对象)。

     

请注意,第二个参数使用对同一对象的引用填充数组

因此,无论何时将2推送到第一个数组,因为它是同一个对象,它会为三个空数组执行此操作。

如果你想只推送到“main”数组中的第一个数组,你可以使用一个块并在那里分配默认对象:

matrix = [[1,2,3],[4,5,6],[7,8,9]]
result = Array.new(matrix[0].length) { [] }
result[0] << 2
p result # [[2], [], []]

答案 1 :(得分:2)

当你这样做时

result = Array.new(matrix[0].length, [])

您基本上创建了一个包含3个点的数组,但所有3个点都引用了相同的数组对象[]。这就是为什么,一旦你做result[0] << 2,这个变化就反映在所有3个点上。

p result.map &:object_id
#=>  [70264755245320, 70264755245320, 70264755245320] # shows the same reference

更改它以使用block notation创建数组。:

result = Array.new(matrix[0].length) { [] }

它通过调用数组中每个元素的块来构成数组,从而为每个位置创建新的引用。

例如:

result = Array.new(matrix[0].length) { puts 'here'; [] }
here
here
here
 => [[], [], []]
 result.map &:object_id
# => [70264754918500, 70264754918440, 70264754918340]