2014-06-08 58 views
1

我創建了一個陣列是這樣的:改變陣列

arr = Array.new(4, Array.new(4, '*')) 

當我試圖改變一個元件,例如第一陣列的第一個元素:

arr[0][0] = 3 

然後每第一個元素是改變。

print arr 
[[3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"], [3, "*", "*", "*"]] 

有人可以解釋爲什麼會發生這種情況嗎?

回答

3

務必:

arr = Array.new(4) { Array.new(4, '*') } 

紅寶石陣列實際上一組指針,它指向到一些其它的目的n中的存儲器。在你的代碼中,所有的指針都指向用Array.new(4, '*')創建的同一個對象。如果不是該值,而是傳遞一個塊,則該塊將爲數組的每個元素執行,因此每個指針都將指向內存中的一個新對象。

事實上,上面的代碼仍然有一個與字符串'*'類似的問題。你應該使用相同的方法來修復它:

arr = Array.new(4) { Array.new(4) { '*' } } 
+0

非常感謝你:)我應該考慮指針 – tupini07