2016-03-08 56 views
0

我在f#中遇到了一些我不明白的行爲。我試圖用嵌套數組創建一個2D表。子數組的長度相同,所以我可以使用Array2D。然而,後來我將需要表格行作爲正常數組,所以爲了避免從多維轉換爲常規數組,我想將表格表示爲鋸齒形數組。F# - (鋸齒形)2d陣列中的賦值元素設置了幾個元素

以下代碼是我如何在表中初始化和分配元素的示例。

let table = Array.create 3 (Array.zeroCreate<int> 2);; 
table.[0].[0] <- 1;; 

我期待這段代碼設置第一行的第一個元素。但是,它實際上所做的是將第一個元素設置爲全部三行

table;; 
val it : int [] [] = [|[|1; 0|]; [|1; 0|]; [|1; 0|]|] 

爲什麼table.[0].[0]在所有三個子數組中設置第一個元素?我試圖找到使用System.Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement的子數組的內存地址,在我看來,他們是不同的,所以他們三行不是相同的數組。這裏發生了什麼?

回答

2

當您使用array.create時,它將一個對象而不是一個函數作爲參數。

因此,參差不齊的數組的每個元素都是對同一個數組的引用,因此您會看到所觀察到的行爲。

僅使用array.create以外的功能來製作陣列