引用单元格

引用单元格是一些存储位置,可以利用它们来创建具有引用语义的可变变量。

语法

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

另请参阅