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.