Тривалість життя в структурах даних

Якщо тип даних зберігає запозичені дані, він повинен мати анотацію із зазначенням тривалості життя:

#[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.
  • У наведеному вище прикладі анотація до Highlight гарантує, що дані, які лежать в основі &str, існують принаймні стільки, скільки існує будь-який екземпляр Highlight, який використовує ці дані.
  • Якщо text буде спожито до закінчення життя fox (або dog), перевірка запозичень видасть помилку.
  • Типи з запозиченими даними змушують користувачів зберігати оригінальні дані. Це може бути корисно для створення полегшених представлень, але загалом робить їх дещо складнішими у використанні.
  • Якщо це можливо, зробіть так, щоб структури даних безпосередньо володіли своїми даними.
  • Деякі структури з декількома посиланнями всередині можуть мати більше ніж одну анотацію про тривалість життя. Це може знадобитися, якщо потрібно описати зв'язки між самими посиланнями впродовж тривалості життя, на додачу до тривалості життя самої структури. Це дуже просунуті випадки використання.