引用单元格 是存储位置,可用于创建具有引用语义的可变值。
语法
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 }
下表显示了引用单元格上可用的功能。
运算符、成员或字段 | DESCRIPTION | 类型 | 定义 |
---|---|---|---|
ref (运算符) |
将值封装到新的引用单元格中。 | 'a -> 'a ref |
let ref x = { contents = x } |
Value (属性) |
获取或设置基础值。 | unit -> 'a |
member x.Value = x.contents |
C# 程序员应该知道 ref
,在 C# 中与 F# 中不同 ref
。 F# 中的等效构造是 byrefs,与引用单元格不同。
标记为“如果关闭捕获”的值 mutable
可能会自动提升为 'a ref
“值”,请参阅 “值”。
弃用的构造
由于 F# 6.0,以下运算符已弃用,其用法会提供信息性警告:
运算符、成员或字段 | DESCRIPTION | 类型 | 定义 |
---|---|---|---|
! (dereference 运算符,已弃用) |
返回基础值。 | '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
编译器选项。 有关详细信息,请参阅 编译器选项。