2016-05-07 113 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