2

私は次のF#コードを持っています:

let list = Array.create 5 (new ResizeArray<char>())
list.[0].Add('c')
printfn "%A" list

これはFSIコンソールの出力です。

[|seq ['c']; seq ['c']; seq ['c']; seq ['c']; seq ['c']|]

最初のインデックスにのみ「c」を追加しようとしていたので、私にはかなり奇妙に思えますが、配列内のすべてのインデックスに追加されているようです。私は何が間違っているのですか?

4

1 に答える 1

5

あなたlistは5つの要素の配列ですが、各要素は同じリストを参照しています。これは、次のコードで確認できます。

let d = list.[0].Equals(list.[1])

d本当になります。

これは、リストを初期化する方法が原因です。5つの要素を含むリストを作成し、5つの要素すべてが同じ値になります。

したがって、を実行するlist.[0].Add('c')と、要素が配列の最初のリストに正しく追加されますが、すべての要素が同じリストを参照しているため、すべての要素に追加されているように見えます。

これを実行して、期待される結果でリストを初期化できます(各要素は異なるリストを参照しています)。

let list = [| for i in 1 .. 5 -> new ResizeArray<char>() |]

ildjarnが述べたように、これはそれを行うためのさらに良い方法です。

let list = Array.init 5 (fun _ -> ResizeArray())
于 2013-03-01T21:34:22.613 に答える