2015-10-10 179 views
-2

我一直在嘗試以縮小的方式編碼一些算法>。 我認爲,典型的二維數組定義是看起來太笨重無法正確初始化數組

mx = Array.new(N) { Array.new(N) } 

我試圖用另一種暗示,但它的行爲是有點怪我:

mx = [[!:&]*n]*n 

請看:

#square matrix n*n 
n=3 
mx = [[!:&]*n]*n 
#=> [[false, false, false], [false, false, false], [false, false, false]] 

mx[0][0]=true  

mx 
#=> [[true, false, false], [true, false, false], [true, false, false]] 
#  true     true     true ???? 
#. 

我該如何馴服我的數組? repl.it_snippet: avaiable

+3

首先,爲什麼用'!:&'而不是'false'?它試圖故意混淆? –

+0

..你有這個微笑,是嗎?) – Vitalyp

回答

3

這是因爲子陣列是相同的實例

#square matrix n*n 
n=3 
mx = [[!:&]*n]*n 
#=> [[false, false, false], [false, false, false], [false, false, false]] 

mx[0] === mx[1] 
# true 

mx[1] === mx[2] 
# true 

修復代碼,添加類似的東西

n=3 
mx = [[!:&]*n]*n 
mx = mx.flatten.each_slice(n).to_a 
mx[0][0] = true 
mx 
# [[true, false, false], [false, false, false], [false, false, false]] 

n=3 
mx = ([!:&]*n*n).each_slice(n).to_a 
mx[0][0] = true 
mx 
# [[true, false, false], [false, false, false], [false, false, false]]