Referenční buňky
Referenční buňky jsou umístění úložiště, která umožňují vytvářet proměnlivé hodnoty s referenční sémantikou.
Syntaxe
ref expression
Poznámky
Pomocí ref
funkce vytvoříte novou odkazovou buňku s počáteční hodnotou. Zdrojovou hodnotu pak můžete změnit, protože je proměnlivá. Odkazové buňky obsahují skutečnou hodnotu; není to pouze adresa.
Následující příklad kódu znázorňuje deklaraci a použití odkazových buněk.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
Výstup je následující.
10
11
Odkazové buňky jsou instance obecného typu záznamu Ref
, který je deklarován následujícím způsobem.
type Ref<'a> =
{ mutable contents: 'a }
'a ref
Typ je synonymem pro Ref<'a>
. Kompilátor a technologie IntelliSense v integrovaném vývojovém prostředí zobrazují nejprve tento typ a následně zdrojovou definici.
Operátor ref
vytvoří novou odkazovou buňku. Následující kód je deklarace operátoru ref
.
let ref x = { contents = x }
V následující tabulce jsou uvedeny funkce, které jsou u odkazové buňky dostupné.
Operátor, člen nebo pole | Popis | Typ | Definice |
---|---|---|---|
ref (operátor) |
Zapouzdří hodnotu do nové odkazové buňky. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (vlastnost) |
Získá nebo nastaví zdrojovou hodnotu. | unit -> 'a |
member x.Value = x.contents |
Programátoři jazyka C# by měli vědět, že ref
v jazyce C# není totéž jako ref
v jazyce F#. Ekvivalentní konstrukce v jazyce F# jsou byrefs, což je jiný koncept než odkazové buňky.
Hodnoty označené jako mutable
mohou být automaticky povýšeny na 'a ref
, pokud jsou zachyceny uzavřením; viz Hodnoty.
Zastaralé konstrukce
Vzhledem k tomu, že F# 6.0 jsou následující operátory zastaralé a jejich použití poskytuje informační upozornění:
Operátor, člen nebo pole | Popis | Typ | Definice |
---|---|---|---|
! (operátor dereference, zastaralý) |
Vrátí zdrojovou hodnotu. | 'a ref -> 'a |
let (!) r = r.contents |
:= (operátor přiřazení, zastaralý) |
Změní zdrojovou hodnotu. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (pole záznamu) |
Získá nebo nastaví zdrojovou hodnotu. | 'a |
let ref x = { contents = x } |
Místo toho je upřednostňované přímé použití .Value
. Viz F # RFC FS-1111.
Toto pole contents
je poskytováno z důvodu kompatibility s jinými verzemi ML a během kompilace vygeneruje upozornění. Pokud chcete upozornění zakázat, použijte možnost kompilátoru --mlcompatibility
. Další informace naleznete v tématu Možnosti kompilátoru.