Lifetimes in Data Structures
Jeżeli typ danych przechowuje pożyczone dane, to muszą one mieć adnotcję czasu życia:
#[derive(Debug)]
struct Highlight<'doc>(&'doc str);
fn erase(text: String) {
println!("Bye {text}!");
}
fn main() {
let text = String::from("The quick brown fox jumps over the lazy dog.");
let fox = Highlight(&text[4..19]);
let dog = Highlight(&text[35..43]);
// erase(text);
println!("{fox:?}");
println!("{dog:?}");
}
This slide should take about 5 minutes.
- W powyższym przykładzie, adnotacja na
Highlightwymaga żeby dane w zawartym&strżyły co najmniej tak długo jak instancjaHighlight, która używa tych danych. - Jeżeli
textjest skonsumowany przed końcem życiafox(lubdog), to nadzorca pożyczania pokaże błąd. - Typy z pożyczonymi danymi wymagają od użytkowników utrzymywania oryginalnych danych. Jest to przydatne przy tworzeniu lekkich widoków, ale generalnie powoduje, że są trudniejsze w użyciu.
- Jeżeli możliwe twórz struktury danych, które bezpośrednio są właścicielami swoich danych.
- Niektóre struktury z wieloma referencjami mogą mieć więcej niż jedną adnotację cyklu życia. To może być potrzebne jeżeli potrzebujesz opisać relację cyklu życia pomiędzy referencjami w dodatku do cyklu życia samej struktury. Są to bardzo zaawansowane przypadki użycia.