2 votes

Est-ce une erreur dans le système de durée de vie de Rust, ou est-ce que je ne comprends pas les durées de vie ?

La fonction suivante est un exemple typique donné lors de l'explication des durées de vie.

fn longest_string<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() >= s2.len() {
        s1
    } else {
        s2
    }
}

Dans la documentation de Rust ( https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html ), nous pouvons lire ce qui suit : " La durée de vie concrète qui est substituée à 'a est la partie de la portée de s1 qui chevauche la portée de s2 ". En d'autres termes, la durée de vie générique 'a obtiendra la durée de vie concrète qui est égale à la plus petite des durées de vie de s1 et s2."

Compte tenu de la description ci-dessus, comment se fait-il que l'exemple suivant se compile ? ?

fn main() {
    let res;
    let s1 = "Hello";
    {
        let s2 = "World!!";
        res = longest_string(s1, s2);
        println!("{} is longer", res);
    }

    println!("Finished with {} and with {}", s1, res); 
    // lifetime of 'res' should be tied to s2, and thus have expired ??
}

Il me semble que la durée de vie de 'res' aurait dû se terminer lorsque s2 est sorti de son champ d'application, ce qui aurait provoqué une erreur de compilation sur la dernière ligne, mais cela ne s'est pas produit. Ceci compile (et s'exécute) sans erreur.

Quelqu'un peut-il expliquer pourquoi ?

2voto

Aleksander Krauze Points 108

Votre exemple fonctionne, parce que les chaînes littérales en rust ont le type &'static str . Donc même cela s2 est dans un bloc séparé, il a la même durée de vie que le bloc s1 . Si vous créez plutôt String à l'intérieur d'un bloc interne et que vous lui avez transmis sa référence, vous obtiendrez l'erreur attendue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X