static |
Statique |
|---|---|
| Rust | |
Syntaxe
| static NOM: Type = valeur; |
| static mut NOM: Type = valeur; |
| &'static Type |
| T: 'static |
Paramètres
| Nom | Description |
|---|---|
| NOM | Ce paramètre permet de définir le nom de la variable globale statique accessible dans l'étendue. |
| Type | Ce paramètre permet de spécifier le type de la valeur contenue dans la variable statique. |
| valeur | Ce paramètre permet de initialiser la variable statique avec une valeur constante au moment du chargement. |
| mut | Ce paramètre permet de rendre une variable statique mutable, ce qui nécessite un accès unsafe. |
| 'static | Ce paramètre permet de définir une durée de vie durant pendant toute l'exécution du programme. |
Description
Ce mot réservé permet d'indiquer une variable globale ou durée de vie durant toute l'exécution du programme.
Remarques
Un élément statique est une valeur valide pendant toute la durée de votre programme (une «durée de vie statique»).
À première vue, les éléments statiques ressemblent beaucoup aux éléments constants : ils contiennent tous deux une valeur, nécessitent des annotations de type et ne peuvent être initialisés qu'avec des fonctions et des valeurs constantes. Cependant, les éléments statiques se distinguent notablement par le fait qu'ils représentent un emplacement en mémoire. Cela signifie que vous pouvez y faire référence et même les modifier, ce qui en fait des variables globales.
Les éléments statiques n'appellent pas la méthode drop à la fin du programme.
Il existe deux types d'éléments statiques : ceux déclarés avec le mot-clef mut et ceux sans.
Les éléments statiques ne peuvent pas être déplacés :
- static VEC: Vec<u32> = vec![];
-
- fn move_vec(v: Vec<u32>) -> Vec<u32> {
- v
- }
-
- // Cette ligne provoque une erreur
- move_vec(VEC);
Statique simple
L'accès aux éléments statiques non mutés est considéré comme sûr, mais certaines restrictions s'appliquent. Plus particulièrement, le type d'une valeur statique doit implémenter le trait Sync, excluant ainsi les conteneurs de mutabilité internes comme RefCell.
- static FOO: [i32; 5] = [1, 2, 3, 4, 5];
-
- let r1 = &FOO as *const _;
- let r2 = &FOO as *const _;
- // Avec une statique strictement en lecture seule, les références auront la même adresse
- assert_eq!(r1, r2);
- // Un élément statique peut être utilisé comme une variable dans de nombreux cas
- println!("{FOO:?}");
Statique mutable
Si un élément statique est déclaré avec le mot-clef mut, il peut être modifié par le programme. Cependant, l'accès à des statiques mutables peut entraîner des comportements indéfinis de plusieurs manières, par exemple en raison de courses de données dans un contexte multi-processus léger. De ce fait, tout accès à des statiques mutables nécessite un bloc non sécurisé.
Lorsque possible, il est souvent préférable d'utiliser une statique non mutable avec un type mutable interne tel que Mutex, OnceLock ou un type atomique.
Malgré leur manque de sécurité, les statiques mutables sont nécessaires dans de nombreux contextes : elles peuvent être utilisées pour représenter un état global partagé par l'ensemble du programme ou dans des blocs externes pour lier des variables de bibliothèques C.
Dans un bloc externe :
Les statiques mutables, tout comme les statiques simples, ont certaines restrictions qui s'appliquent à elles.