我有以下F#代码:
let list = Array.create 5 (new ResizeArray<char>())
list.[0].Add('c')
printfn "%A" list
Run Code Online (Sandbox Code Playgroud)
这是FSI控制台中的输出:
[|seq ['c']; seq ['c']; seq ['c']; seq ['c']; seq ['c']|]
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很奇怪,因为我试图仅将'c'添加到第一个索引,但它似乎添加到数组中的所有索引.我究竟做错了什么?
您list是一个包含5个元素的数组,但每个元素都引用相同的列表.您可以使用以下代码进行检查:
let d = list.[0].Equals(list.[1])
Run Code Online (Sandbox Code Playgroud)
d 将是真的.
这是因为您正在初始化列表的方式 - 您正在创建一个包含5个元素的列表,其中所有5个元素都是相同的值.
因此,当您执行此操作时list.[0].Add('c'),它会正确地将元素附加到数组中的第一个列表,但由于所有元素都引用相同的列表,因此它似乎将它附加到每个元素.
您可以使用预期结果初始化列表(每个元素引用不同的列表):
let list = [| for i in 1 .. 5 -> new ResizeArray<char>() |]
Run Code Online (Sandbox Code Playgroud)
正如ildjarn所说,这是一种更好的方法:
let list = Array.init 5 (fun _ -> ResizeArray())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1420 次 |
| 最近记录: |