Lifetime'y w Rust służą między innymi do tego, żeby upewnić się, że nie odwołujesz się do pamięci, która została już zwolniona. Weźmy taki minimalny przykład:
fn do_something(a: &A, b: &B) -> &isize { ... }
Zwracamy referencję do isize
. Powstaje pytanie - od czego uzależniona jest poprawność zwracanej referencji? Czy wskazuje ona na jakieś pole wewnątrz a
, czy coś w b
? Czy może czasami tak, a czasami tak - zależnie od wartości siedzących w tych zmiennych? Jak zapewnić poprawność referencji, skoro nie wiemy, jak w ogóle ją określić?
fn do_something<'la, 'lb>(a: &'la A, b: &'lb B) -> &'la isize { ... }
Tutaj mamy explicite podane lifetime'y i od razu widać, że zwracana referencja na isize
ma taki sam lifetime, jak otrzymywana referencja na A
. Zatem po wywołaniu funkcji możemy od razu pozbyć się wartości typu B
i nasza referencja na isize
będzie dalej prawidłowa. Pozbycie się A
spowodowałoby z kolei unieważnienie tej referencji.
Przykład w Rust Playground: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=bc3f4b7ff82e5bb208865daa98f710c3