2011-10-07 21 views
0

下面的代碼:陣列行爲不端

# a = Array.new(3, Array.new(3)) 
a = [[nil,nil,nil],[nil,nil,nil]] 
a[0][0] = 1 
a.each {|line| p line} 

隨着輸出:

[1, nil, nil] 
[nil, nil, nil] 

但使用註釋行:

[1, nil, nil] 
[1, nil, nil] 
[1, nil, nil] 

那麼,爲什麼會這樣?

+1

類似的事情可能發生在哈希:http://stackoverflow.com/questions/2698460/strange-ruby-behavior-when-using-hash-new –

+0

可能的重複[這是Array.fill中的錯誤方法在Ruby?](http://stackoverflow.com/questions/3285229/is-this-a-bug-in-the-array-fill-method-in-ruby)。我偶然碰巧遇到了這個騙局,並且意識到它與這個類似,所以它不是一個容易找到的重複。 –

回答

6

註釋行將的相同參考中的三個分配給數組,因此對一個數組的更改將傳播給其他對它的引用。

至於2數組vs 3,這只是第一行指定3作爲其第一個參數,只在第二行指定2個數組文字的問題。

,而無需任何共享引用創建嵌套的數組:

a = Array.new(3) {Array.new(3)} 

當傳遞塊({...}do ... end),Array.new將調用塊以獲得陣列的每個元素的值。

+0

合理。謝謝。 – CamelCamelCamel