引用单元格

引用单元 是使你能够创建具有引用语义的可变值的存储位置。

语法

ref expression

备注

可以在值前面使用 ref 运算符来创建用于封装该值的新引用单元格。 然后,您可以更改基础值,因为该值是可变的。

引用单元格容纳实际值;它不仅仅是一个地址。 使用 ref 运算符创建引用单元格时,将以封装的可变值的形式创建基础值的副本。

可以使用 !(感叹号)运算符取消对引用单元格的引用。

下面的代码示例阐释了引用单元格的声明和用法。

// Declare a reference.
let refVar = ref 6

// Change the value referred to by the reference.
refVar := 50

// Dereference by using the ! operator.
printfn "%d" !refVar

输出为 50

引用单元格是 Ref 泛型记录类型的实例,声明方式如下所示。

type Ref<'a> =
{ mutable contents: 'a }

类型 'a refRef<'a> 的同义词。 IDE 中的编译器和 IntelliSense 显示此类型的前者,而基础定义是后者。

ref 运算符创建新引用单元格。 下面的代码声明 ref 运算符。

let ref x = { contents = x }

下表显示了可用于引用单元格的功能。

运算符、成员或字段 说明 类型 定义
!(取消引用运算符) 返回基础值。 'a ref -> 'a let (!) r = r.contents
:=(赋值运算符) 更改基础值。 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
ref(运算符) 将值封装到新的引用单元格中。 'a -> 'a ref let ref x = { contents = x }
Value(属性) 获取或设置基础值。 unit -> 'a member x.Value = x.contents
contents(记录字段) 获取或设置基础值。 'a let ref x = { contents = x }

可通过多种方式来访问基础值。 取消引用运算符 (!) 返回的值不是可赋值的值。 因此,如果要修改基础值,您必须改用赋值运算符 (:=)。

Value 属性和 contents 字段都是可赋值的值。 因此,您可以使用它们来访问或更改基础值,如下面的代码所示。

let xRef : int ref = ref 10

printfn "%d" (xRef.Value)
printfn "%d" (xRef.contents)

xRef.Value <- 11
printfn "%d" (xRef.Value)
xRef.contents <- 12
printfn "%d" (xRef.contents)

输出如下所示。

10
10
11
12

提供字段 contents 的目的是为了与其他版本的 ML 兼容,并且该字段将在编译过程中产生警告。 若要禁用警告,请使用 --mlcompatibility 编译器选项。 有关详细信息,请参阅 编译器选项

C # 程序员应知道, ref 在 c # 中与 ref F # 中的内容不同。 F # 中的等效构造是 byref,这是不同于引用单元的概念。

mutable如果由闭包捕获,则标记为的值可能会自动提升为 'a ref ; 请参阅

另请参阅