2016-05-07 100 views
5

我在http://prepwork.appacademy.io/mini-curriculum/array/红宝石 - >写入二维数组

我试图创建函数,my_transpose,这需要在一个矩阵,并返回其转介绍的数组问题的工作。

我对编写2D数组非常困惑!这是一个代码片段,突出了我的困惑。

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]] 

为什么对列[0] [0]的修改会更改所有三个变量?不应该只是改变第一行中的第一个单元格吗?

回答

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

很好的答案,但可能值得简要解释*为什么*您的解决方案有效。 –

+0

谢谢!完善! – bmillsiv

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]] 

请参阅Array::new

+0

哇,非常优雅。我非常喜欢那个。谢谢! – bmillsiv