引用单元格
引用单元格是一些存储位置,可以利用它们来创建具有引用语义的可变变量。
语法
ref expression
备注
使用 ref
函数创建具有初始值的新引用单元格。 然后,您可以更改基础值,因为该值是可变的。 引用单元格容纳实际值;它不仅仅是一个地址。
下面的代码示例阐释了引用单元格的声明和用法。
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
输出如下所示。
10
11
引用单元格是 Ref
泛型记录类型的实例,声明方式如下所示。
type Ref<'a> =
{ mutable contents: 'a }
类型 'a ref
是 Ref<'a>
的同义词。 IDE 中的编译器和 IntelliSense 显示此类型的前者,而基础定义是后者。
ref
运算符创建新引用单元格。 下面的代码声明 ref
运算符。
let ref x = { contents = x }
下表显示了可用于引用单元格的功能。
运算符、成员或字段 | 说明 | 类型 | 定义 |
---|---|---|---|
ref (运算符) |
将值封装到新的引用单元格中。 | 'a -> 'a ref |
let ref x = { contents = x } |
Value (属性) |
获取或设置基础值。 | unit -> 'a |
member x.Value = x.contents |
C# 程序员应知道,C# 中的 ref
与 F# 中的 ref
不同。 F# 中的等效构造是 byrefs,它是与引用单元格不同的概念。
如果被闭包捕获,则标记为 mutable
的值可能会自动提升为 'a ref
;请参阅值。
已弃用的构造
自 F# 6.0 起,以下运算符已弃用,并且使用它们会发出信息性警告:
运算符、成员或字段 | 说明 | 类型 | 定义 |
---|---|---|---|
! (取消引用运算符,已弃用) |
返回基础值。 | 'a ref -> 'a |
let (!) r = r.contents |
:= (赋值运算符,已弃用) |
更改基础值。 | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (记录字段) |
获取或设置基础值。 | 'a |
let ref x = { contents = x } |
改为首选直接使用 .Value
; 请参阅 F# RFC FS-1111。
提供字段 contents
的目的是为了与其他版本的 ML 兼容,并且该字段将在编译过程中产生警告。 若要禁用警告,请使用 --mlcompatibility
编译器选项。 有关详细信息,请参阅编译器选项。