Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 .