Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Времена жизни в структурах данных

Если тип данных хранит заимствованные данные, его нужно аннотировать временем жизни:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[derive(Debug)]
enum HighlightColor {
    Pink,
    Yellow,
}

#[derive(Debug)]
struct Highlight<'document> {
    slice: &'document str,
    color: HighlightColor,
}

fn main() {
    let doc = String::from("The quick brown fox jumps over the lazy dog.");
    let noun = Highlight { slice: &doc[16..19], color: HighlightColor::Yellow };
    let verb = Highlight { slice: &doc[20..25], color: HighlightColor::Pink };
    // drop(doc);
    dbg!(noun);
    dbg!(verb);
}
This slide should take about 5 minutes.
  • В примере выше аннотация у Highlight требует, чтобы данные, лежащие в основе содержащейся &str, жили не меньше, чем любой экземпляр Highlight, использующий эти данные. Структура не может жить дольше данных, на которые она ссылается.
  • Если doc будет освобождён раньше окончания времени жизни noun или verb, анализатор заимствований выдаст ошибку.
  • Типы с заимствованными данными заставляют пользователей сохранять исходные данные. Это может быть полезно для создания лёгких представлений, но обычно делает их несколько сложнее в использовании.
  • Когда возможно, пусть структуры данных владеют своими данными напрямую.
  • Некоторые структуры с несколькими ссылками внутри могут иметь больше одной аннотации времени жизни. Это может понадобиться, если нужно описать отношения времён жизни между самими ссылками, помимо времени жизни самой структуры. Это очень продвинутые сценарии.