改变 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>] Record
s 做同样的坏事?我怀疑可能涉及 ref
或 byref
,但我似乎无法让它工作。
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
此代码展示了如何使函数改变其输入 - 这是我们使用 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>] Record
s 做同样的坏事?我怀疑可能涉及 ref
或 byref
,但我似乎无法让它工作。
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