突变F#[<struct>]记录

时间:2018-11-10 02:54:11

标签: struct f# 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做同样的坏事?我怀疑可能会涉及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

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