引用单元格

引用单元格 是存储位置,可用于创建具有引用语义的可变值。

语法

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 编译器选项。 有关详细信息,请参阅 编译器选项

另请参阅