Ruby -> 写入二维数组

4

我正在解决http://prepwork.appacademy.io/mini-curriculum/array/中列出的数组问题。

我正试图创建一个函数my_transpose,它接收一个矩阵并返回其转置。

我非常困惑如何写一个二维数组!以下是一个代码片段,突显了我的困惑。

rows = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8]
  ]

columns = Array.new(3 , Array.new(3))
puts columns.to_s #Output is a 3 x 3 array filled with nil
columns[0][0] = 0
puts columns.to_s #Output is [[0,nil,nil], [0,nil,nil], [0,nil,nil]]

为什么修改columns[0][0]的值会影响到所有三个变量?它不应该只改变第一行第一列的单元格吗?
2个回答

7
columns = Array.new(3 , Array.new(3))

这里,调用了一次 Array.new(3),而 columns 的三个子数组实际上都引用了同一个 Array 对象。可以查看它们的 object_id

columns[0].object_id
# => 70296096047460
columns[1].object_id
# => 70296096047460
columns[2].object_id
# => 70296096047460

这就是为什么修改columns[0][0]会使columns[1][0]columns[2][0]也被修改的原因。
使用以下代替:
columns = Array.new(3) {Array.new(3)}

1
很好的答案,但简要解释一下为什么你的解决方案有效可能值得一提。 - Jordan Running

3
@YuHao已经解释过,您需要:
Array.new(3) { Array.new(3) }

事实上,您可以稍微扩展一下,以创建您自己的转置方法:
def my_transpose(arr)
  Array.new(arr.size) { |i| Array.new(arr.size) { |j| arr[j][i] } }
end

my_transpose(rows)
  #=> [[0, 3, 6],
  #    [1, 4, 7],
  #    [2, 5, 8]] 

请查看 数组::新

哇,非常优雅。我非常喜欢。谢谢! - bmillsiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接