我做了:
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
答案 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]