2016-03-08 57 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以外的功能来制作阵列