參考儲存格
參考儲存格是可讓您以參考語意建立可變值的儲存位置。
語法
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
編譯器選項。 如需詳細資訊,請參閱編譯器選項。