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.

Viz také