
II. Spécificités de Rust
5. Durée de vie (ou lifetime)
Il existe plusieurs types de durée de vie. Jusqu'à présent, nous n'avons vu que les plus basiques, mais sachez qu'il en existe encore deux autres :
- Les durées de vie statiques.
- Les durées de vie associées.
Les durées de vie statiques permettent aux références de référencer des variables statiques ou du contenu "constant" :
Run// Avec une variable statique.
static VAR: i32 = 0;
let variable_static: &'static i32 = &VAR;
// Avec du contenu constant.
let variable_const: &'static str = "Ceci est une str constante !";
Rien de bien difficile ici, l'autre est un peu plus complexe mais aussi moins visible. Imaginons que l'on écrive une structure dont l'un des champs devait être modifié à l'extérieur de la structure. On se contenterait de renvoyer &mut self.ma_variable
. Bien que ce code fonctionne, il est important de comprendre ce qu'il se passe :
Runstruct MaStruct {
variable: String,
}
impl MaStruct {
fn get_variable(&mut self) -> &mut String {
&mut self.variable
}
}
fn main() {
let mut v = MaStruct { variable: String::new() };
v.get_variable().push_str("hoho !");
println!("{}", v.get_variable());
}
La méthode get_variable
va en fait renvoyer une référence temporaire sur self.variable. Si on voulait écrire ce code de manière "complète", on l'écrirait comme ceci :
Runimpl MaStruct {
fn get_variable<'a>(&'a mut self) -> &'a mut String {
&mut self.variable
}
}
'a représente la durée de vie (cela aurait tout aussi bien pu être 'x ou 'z, peu importe). Ici, on retourne donc une référence avec une durée de vie 'a sur une variable.
Je tenais à vous parler de ce dernier point pour que vous compreniez bien comment tout cela fonctionne, le premier code sans l'ajout des paramètres de durée de vie était tout à fait fonctionnel, mais moins explicite.