Komórki odwołań

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ą. Podstawową wartość można będzie wtedy zmieniać, ponieważ jest ona modyfikowalna. Komórka odwołania zawiera wartość rzeczywistą, a nie sam adres.

Poniższy przykład kodu ilustruje deklarowanie i używanie komórek odwołań.

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> Pierwszy zapis jest stosowany do wyświetlania tego typu w kompilatorze i technologii IntelliSense w środowisku IDE, jednak podstawowa definicja ma postać jak w drugim zapisie.

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, które są dostępne w komórce odwołania.

Operator, element członkowski lub pole opis Type Definicja
ref (operator) Hermetyzuje wartość do nowej komórki 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, element członkowski lub pole opis Type Definicja
! (operator dereference, przestarzały) Zwraca podstawową wartość. 'a ref -> 'a let (!) r = r.contents
:= (operator przypisania, przestarzałe) Zmienia podstawową wartość. '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 też