J'ai eu du mal à comprendre les durées de vie et j'apprécierais un peu d'aide pour comprendre certaines subtilités qui sont généralement absentes des ressources et des autres questions/réponses ici. Même la section entière du Livre est trompeuse car son exemple principal utilisé comme justification derrière les durées de vie est plus ou moins faux (c'est-à-dire que le compilateur peut très facilement déduire les durées de vie sur la fonction mentionnée).
En prenant cette fonction (un peu similaire au livre) comme exemple:
fn foo<'a>(x: &'a str, y: &'a str) -> &'a str {
x
}
Ma compréhension est que les durées de vie explicites affirment que la référence renvoyée ne doit pas vivre plus longtemps que la plus courte des durées de vie de x
et y
. Autrement dit, à la fois x
et y
devraient survivre à la référence renvoyée. (Bien que je ne sois pas du tout sûr de ce que le compilateur fait exactement, vérifie-t-il les durées de vie des arguments puis compare le minimum avec la durée de vie de la référence renvoyée ?)
Mais alors, que signifierait la durée de vie si nous n'avions pas de valeurs de retour ? Cela implique-t-il un sens spécial (par exemple, par rapport à l'utilisation de deux durées de vie différentes ?)
fn foo<'a>(x: &'a str, y: &'a str) {
}
Et ensuite nous avons des structures telles que:
struct Foo<'a, 'b> {
x: &'a i32,
y: &'b i32,
}
Et
struct Foo<'a> {
x: &'a i32,
y: &'a i32,
}
Il semble que l'utilisation de la même durée de vie pour les champs ajoute des contraintes, mais quelle est exactement cette contrainte qui cause certains exemples de ne pas fonctionner?
Cela pourrait nécessiter une question à part entière, mais il y a beaucoup de mentions de durées de vie et de portées étant différentes mais sans beaucoup d'explications, y a-t-il des ressources approfondissant cela, en particulier en considérant les durées de vie non lexicales ?