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 ?