改变 F# [<Struct>] 记录

Mutate F# [<Struct>] Record

此代码展示了如何使函数改变其输入 - 这是我们使用 F# 来避免的事情之一。

type Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside a =
    a.n <- a.n + 1
    a.n

let a = {n = 1}

printInside a //a = 1
inside a
printInside a //a = 2

话虽如此,我如何用 [<Struct>] Records 做同样的坏事?我怀疑可能涉及 refbyref,但我似乎无法让它工作。

type [<Struct>] Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside a =
    a.n <- a.n + 1
    a.n

let a = {n = 1}

printInside a //a = 1
inside a
printInside a //a = 2

根本问题是,只有结构本身是可变的,才能修改可变字段。如您所述,我们需要在 Age 的声明中使用 byref。我们还需要确保 a 是可变的,最后我们需要在调用函数 inside 时使用 & 运算符。 & 是使用 byref 参数调用函数的方法。

type [<Struct>] Age = { mutable n : int }
let printInside a = printfn "Inside = %d" a.n
let inside (a : Age byref) =
    a.n <- a.n + 1
    a.n

let mutable a = {n = 1}

printInside a //a = 1
inside &a
printInside a //a = 2

现在我已经掌握了模式,下面是一个简单的示例(只是 int 而不是 struct record),说明如何改变传递给函数的值:

let mutable a = 1
let mutate (a : byref<_>) = a <- a + 1
mutate &a
a //a = 2