Rust

Any donation is very welcome
Fork me on GitHub

II. Spécificités de Rust

6. 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 basique 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 vous écriviez une classe dont l'une des variables membre devait être modifiée à l'extérieur de la structure. Vous vous contentez de renvoyer une "&mut self.ma_variable", je me trompe ? 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 clair.