首页 > 解决方案 > 变异 F# [] 记录

问题描述

这段代码展示了如何让一个函数改变它的输入——这是我们使用 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

话虽如此,我如何对 s 做同样的坏事[<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

标签: structf#record

解决方案


根本问题是,只有结构本身是可变的,才能修改可变字段。正如您所指出的,我们需要byref在声明中使用 Age。我们还需要确保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

推荐阅读