Cellules de référence
Les cellules de référence sont des emplacements de stockage qui vous permettent de créer des valeurs mutables avec la sémantique de référence.
Syntaxe
ref expression
Notes
Vous utilisez la fonction ref
pour créer une cellule de référence avec une valeur initiale. Vous pouvez ensuite modifier la valeur sous-jacente, car elle est mutable. Une cellule de référence contient une valeur réelle, et pas uniquement une adresse.
L'exemple de code suivant illustre la déclaration et l'utilisation de cellules de référence.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
La sortie est la suivante.
10
11
Les cellules de référence sont des instances du type d'enregistrement générique Ref
qui est déclaré comme suit.
type Ref<'a> =
{ mutable contents: 'a }
Le type 'a ref
(affiché par le compilateur et IntelliSense dans l'IDE) est un synonyme de Ref<'a>
(définition sous-jacente).
L'opérateur ref
crée une cellule de référence. Le code suivant est la déclaration de l'opérateur ref
.
let ref x = { contents = x }
Le tableau suivant répertorie les fonctionnalités disponibles sur la cellule de référence.
Opérateur, membre ou champ | Description | Type | Définition |
---|---|---|---|
ref (opérateur) |
Encapsule une valeur dans une nouvelle cellule de référence. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (propriété) |
Obtient ou définit la valeur sous-jacente. | unit -> 'a |
member x.Value = x.contents |
Les programmeurs C# doivent savoir que ref
en C# n’est pas la même chose que ref
en F#. Les constructions équivalentes en F# sont byrefs, qui correspondent à un concept différent des cellules de référence.
Les valeurs marquées comme mutable
peuvent être automatiquement promues en 'a ref
si elles sont capturées par une fermeture ; consultez Valeurs.
Constructions dépréciées
Depuis F# 6.0, les opérateurs suivants sont dépréciés et leur utilisation donne des avertissements d’information :
Opérateur, membre ou champ | Description | Type | Définition |
---|---|---|---|
! (opérateur de déréférencement, déprécié) |
Retourne la valeur sous-jacente. | 'a ref -> 'a |
let (!) r = r.contents |
:= (opérateur d’affectation, déprécié) |
Modifie la valeur sous-jacente. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (champ d'enregistrement) |
Obtient ou définit la valeur sous-jacente. | 'a |
let ref x = { contents = x } |
Au lieu de cela, l’utilisation directe de .Value
est recommandée ; consultez RFC F# FS-1111.
Le champ contents
est fourni à des fins de compatibilité avec d'autres versions de ML et produit un avertissement au cours de la compilation. Pour désactiver l'avertissement, utilisez l'option de compilateur --mlcompatibility
. Pour plus d’informations, consultez l’article Options du compilateur.