F# - (锯齿状)2d阵列中的赋值元素设置了几个元素

时间:2016-03-08 08:57:59

标签: arrays multidimensional-array f#

我在f#中遇到了一些我不理解的行为。我试图使用嵌套数组创建一个2d表。子阵列的长度相同,所以我可以使用Array2D。但是后来我需要将表行作为普通数组,因此为了避免从多维转换为常规数组,我想将表表示为锯齿状数组。

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

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查找子阵列的内存地址,在我看来它们是不同的,所以它们的三行不是同一个数组。这是怎么回事?

1 个答案:

答案 0 :(得分:2)

使用array.create时,它将对象作为参数,而不是函数。

因此,锯齿状数组的每个元素都是对同一个数组的引用,因此您可以获得观察到的行为。

只需使用array.create以外的函数来制作数组