此代码显示了如何使函数改变其输入-这是我们在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
做同样的坏事?我怀疑可能会涉及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
答案 0 :(得分:4)
基本问题是,仅当结构本身是可变的时才可以修改可变字段。如您所述,我们需要在年龄声明中使用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
答案 1 :(得分:0)
现在我掌握了模式,这是一个简单的示例(只是int
而不是struct record
),说明了如何对传递给函数的值进行突变:
let mutable a = 1
let mutate (a : byref<_>) = a <- a + 1
mutate &a
a //a = 2