ref |
Référence |
|---|---|
| Rust | |
Syntaxe
| let ref nom = expression; |
| let ref mut nom = expression; |
| let (ref a, ref mut b) = ...; |
|
match valeur { Pattern(ref x) => ..., } |
Paramètres
| Nom | Description |
|---|---|
| ref nom | Ce paramètre permet de créer une liaison par référence immuable à une valeur lors d'une affectation ou d'une correspondance de motif. |
| ref mut nom | Ce paramètre permet de créer une liaison par référence mutable, permettant de modifier la valeur référencée. |
| (ref a, ref mut b) | Ce paramètre permet de lier plusieurs variables à la fois par référence immuable ou mutable dans une déstructuration. |
| Pattern(ref x) | Ce paramètre permet d'extraire une référence immuable dans un match sur un motif structuré. |
Description
Ce mot réservé permet de lier par référence.
Remarques
Permet d'indiquer la liaison par référence lors de la recherche de motifs.
ref annote les liaisons de motifs pour les emprunter plutôt que de les déplacer. Elle ne fait pas partie du motif en ce qui concerne la recherche de motifs : elle n'affecte pas la recherche de correspondances, mais seulement la manière dont elles sont recherchées.
Par défaut, les instructions de recherche de motifs consomment tout ce qu'elles peuvent, ce qui peut parfois poser problème lorsque le déplacement et la possession de la valeur ne sont pas nécessaires :
- let maybe_name = Some(String::from("Alice"));
- // La variable 'maybe_name' est consommée ici...
- match maybe_name {
- Some(n) => println!("Bonjour, {n}"),
- _ => println!("Bonjour, monde"),
- }
- // ... et n'est désormais plus disponible.
- println!("Bonjour à nouveau, {}", maybe_name.unwrap_or("monde".into()));
En utilisant le mot clef ref, la valeur est uniquement empruntée, et non déplacée, ce qui la rend disponible pour une utilisation après l'instruction match :
- let maybe_name = Some(String::from("Alice"));
- // En utilisant `ref`, la valeur est empruntée, pas déplacée...
-
- match maybe_name {
- Some(ref n) => println!("Bonjour, {n}"),
- _ => println!("Bonjour, monde"),
- }
- // ... donc c'est disponible ici !
- println!("Bonjour à nouveau, {}", maybe_name.unwrap_or("monde".into()));
& vs ref
& indique que votre modèle attend une référence à un objet. Par conséquent, & fait partie de ce modèle : &Foo correspond à des objets différents de Foo.
ref indique que vous souhaitez une référence à une valeur non compressée. Il n'est pas mis en correspondance avec : Foo(ref foo) correspond aux mêmes objets que Foo(foo).