Parametr cyklu życia zmiennych, operator <'lifetime>

0

Cześć,
mógłby mi ktoś w jasny sposób wytłumaczyć na czym polega i czemu służy mechanizm nadawania cyklu życia zmiennych/argumentów funkcji/pól struktury w Ruscie? Albo chociaż podrzucić jakiś link tłumaczący te zagadnienie. Mielę książkę Programowanie w języku Rust - wydajność i bezpieczeństwo i nie mogę tego zrozumieć :<

Przykładowy kod:

fn smallest<'a>(v: &'a [i32]) -> &'a i32 { ... }
2

Oficjalny poradnik ma kilka przydatnych rozdziałów, które pomogły mi zrozumieć koncept:

6

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1