Sdílet prostřednictvím


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. Potom můžete změnit podkladovou hodnotu, protože je proměnlivá. Referenční buňka obsahuje skutečnou hodnotu; není to jen adresa.

Následující příklad kódu znázorňuje deklaraci a použití referenční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 IntelliSense v integrovaném vývojovém prostředí (IDE) zobrazují první pro tento typ, ale základní definice je druhá.

Operátor ref vytvoří novou odkazovou buňku. Následující kód je deklarace operátoru ref .

let ref x = { contents = x }

Následující tabulka ukazuje funkce, které jsou k dispozici v referenční buňce.

Operátor, člen nebo pole Popis Typ Definice
ref (operátor) Zapouzdřuje hodnotu do nové odkazové buňky. 'a -> 'a ref let ref x = { contents = x }
Value (vlastnost) Získá nebo nastaví podkladovou 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í podkladovou hodnotu. 'a ref -> 'a let (!) r = r.contents
:= (operátor přiřazení, zastaralý) Změní podkladovou hodnotu. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (pole záznamu) Získá nebo nastaví podkladovou 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é