struct - 变异 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
?我怀疑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
解决方案
根本问题是,只有结构本身是可变的,才能修改可变字段。正如您所指出的,我们需要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
推荐阅读
- javascript - ReactJS:在特定组件中包含脚本
- javascript - Kafka消费者onmessage - api调用对每条消息进行多次调用?
- java - (谓词)或(字符串)
- vue.js - Vue改变图标点击按钮
- python - BeautifulSoup 从变量中提取 json 作为没有 TAG 的字符串
- dart - 如何在 Flutter 中创建多个 DropdownButton?
- mysql - 试图在 mysql 中编辑 my.cnf 文件,但它不起作用
- firebase - 如何为每个用户/组的集合设置 Firebase Firestore 安全性?
- ruby-on-rails - 具有多态关联的未知属性
- ansible - ssh 密钥的 Ansible 手册:一对一、一对多、多对一