Udostępnij za pomocą


Komórki odwołania

Komórki referencyjne to lokalizacje przechowywania, które umożliwiają tworzenie modyfikowalnych wartości z semantykami odwołań.

Składnia

ref expression

Uwagi

Funkcja służy ref do tworzenia nowej komórki odwołania z wartością początkową. Następnie można zmienić wartość bazową, ponieważ jest modyfikowalna. Komórka odwołania zawiera rzeczywistą wartość; to nie tylko adres.

Poniższy przykład kodu ilustruje deklarację i użycie komórek referencyjnych.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

Dane wyjściowe są następujące:

10
11

Komórki referencyjne są wystąpieniami ogólnego typu rekordu Ref , który jest zadeklarowany w następujący sposób.

type Ref<'a> =
    { mutable contents: 'a }

Typ 'a ref jest synonimem .Ref<'a> Kompilator i funkcja IntelliSense w środowisku IDE wyświetlają pierwszy dla tego typu, ale podstawowa definicja jest druga.

Operator ref tworzy nową komórkę odwołania. Poniższy kod to deklaracja ref operatora.

let ref x = { contents = x }

W poniższej tabeli przedstawiono funkcje dostępne w komórce odwołania.

Operator, członek lub pole Opis Typ Definicja
ref (operator) Hermetyzuje wartość w nowej komórce odwołania. 'a -> 'a ref let ref x = { contents = x }
Value (właściwość) Pobiera lub ustawia podstawową wartość. unit -> 'a member x.Value = x.contents

Programiści języka C# powinni wiedzieć, że ref w języku C# nie jest to samo, co ref w języku F#. Równoważne konstrukcje w języku F# są elementami byref, które są inną koncepcją niż komórki referencyjne.

Wartości oznaczone jako mutable mogą być automatycznie promowane do 'a ref wartości w przypadku przechwycenia przez zamknięcie. Zobacz Wartości.

Przestarzałe konstrukcje

Ponieważ język F# 6.0, następujące operatory są przestarzałe, a ich użycie daje ostrzeżenia informacyjne:

Operator, członek lub pole Opis Typ Definicja
! (operator dereference, przestarzały) Zwraca wartość bazowa. 'a ref -> 'a let (!) r = r.contents
:= (operator przypisania, przestarzałe) Zmienia wartość bazowa. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (pole rekordu) Pobiera lub ustawia podstawową wartość. 'a let ref x = { contents = x }

Zamiast tego preferowane jest bezpośrednie użycie .Value ; zobacz F# RFC FS-1111.

Pole contents jest udostępniane pod kątem zgodności z innymi wersjami uczenia maszynowego i spowoduje wygenerowanie ostrzeżenia podczas kompilacji. Aby wyłączyć ostrzeżenie, użyj opcji kompilatora --mlcompatibility . Aby uzyskać więcej informacji, zobacz opcje kompilatora .

Zobacz także