我正在将数组转换为记录类型.就像是:
let value = [|"1";"2";"3";"Not a number";"5"|]
type ValueRecord = {
One: int32
Two: int32
Three: int32
Four: string
Five: int32 }
let convertArrayToRecord (x: string array) =
{ One = x.[0] |> Int.Parse
Two = x.[1] |> Int.Parse
Three = x.[2] |> Int.Parse
Four = x.[3]
Five = x.[4] |> Int.Parse }
let recordValue = convertArrayToRecord value
Run Code Online (Sandbox Code Playgroud)
这有效,但缺点是在数组中间添加一个值会导致手动编辑所有索引引用,如下所示:
let value = [|"1";"Not a number - 6";"2";"3";"Not a number";"5"|]
type ValueRecord = {
One: int32
Six: string
Two: int32
Three: int32
Four: string
Five: int32 }
let convertArrayToRecord (x: string array) =
{ One = x.[0] |> Int.Parse
Six = x.[1]
Two = x.[2] |> Int.Parse //<--updated index
Three = x.[3] |> Int.Parse //<--updated index
Four = x.[4] //<--updated index
Five = x.[5] |> Int.Parse } //<--updated index
let recordValue = convertArrayToRecord value
Run Code Online (Sandbox Code Playgroud)
此外,它容易意外地使索引错误.
我想出的解决方案是:
let convertArrayToRecord (x: string array) =
let index = ref 0
let getIndex () =
let result = !index
index := result + 1
result
{ One = x.[getIndex ()] |> Int.Parse
Six = x.[getIndex ()]
Two = x.[getIndex ()] |> Int.Parse
Three = x.[getIndex ()] |> Int.Parse
Four = x.[getIndex ()]
Five = x.[getIndex ()] |> Int.Parse }
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我真的不喜欢ref cell,因为它不是并发的.有没有更好/更清洁的方法来实现这一目标?
您可以使用模式匹配.
let convertArrayToRecord = function
| [|one; two; three; four; five|] ->
{
One = int one
Two = int two
Three = int three
Four = four
Five = int five
}
| _ ->
failwith "How do you want to deal with arrays of a different length"
Run Code Online (Sandbox Code Playgroud)
向阵列添加另一个条目时,您可以通过编辑第一个匹配来调整它[|one; six; two; three; four; five|].
顺便说一句,对于像你在当前例子中使用的索引一样的可变索引,你可以通过使用mutable关键字来避免ref,就像这样;
let mutable index = -1
let getIndex =
index <- index + 1
index
Run Code Online (Sandbox Code Playgroud)
如果我们在getIndex函数中隐藏mutable
let getIndex =
let mutable index = -1
fun () ->
index <- index + 1
index
Run Code Online (Sandbox Code Playgroud)