Аннотации времени жизни в Rust и проверяющая система ссылок

RustRustBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе представляется концепция явных аннотаций времени жизни в Rust, которые используются проверяющей системой ссылок для определения валидности ссылок.

Примечание: Если в лабе не указано имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Явная аннотация

Проверяющая система ссылок использует явные аннотации времени жизни для определения того, насколько долго ссылки должны быть валидными. В случаях, когда времени жизни не могут быть опущены, Rust требует явных аннотаций для определения времени жизни ссылки. Синтаксис для явной аннотации времени жизни использует знак апострофа следующим образом:

foo<'a>
// `foo` имеет параметр времени жизни `'a`

Похожий на замыкания, использование времени жизни требует обобщений. Кроме того, этот синтаксис времени жизни указывает, что время жизни foo не может превышать время жизни 'a. Явная аннотация типа имеет форму &'a T, где 'a уже был определен.

В случаях с несколькими временем жизни синтаксис аналогичен:

foo<'a, 'b>
// `foo` имеет параметры времени жизни `'a` и `'b`

В этом случае время жизни foo не может превышать время жизни 'a или 'b.

Посмотрите на следующий пример для явной аннотации времени жизни в действии:

// `print_refs` принимает две ссылки на `i32`, которые имеют разные
// времена жизни `'a` и `'b`. Эти два времени жизни должны быть как минимум
// столькими же, как и функция `print_refs`.
fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
    println!("x is {} and y is {}", x, y);
}

// Функция, которая не принимает аргументов, но имеет параметр времени жизни `'a`.
fn failed_borrow<'a>() {
    let _x = 12;

    // ОШИБКА: `_x` не имеет достаточно длительного времени жизни
    let y: &'a i32 = &_x;
    // Попытка использовать время жизни `'a` в качестве явной аннотации типа
    // внутри функции завершится ошибкой, потому что время жизни `&_x` короче,
    // чем время жизни `y`. Короткое время жизни не может быть приведено к более длительному.
}

fn main() {
    // Создайте переменные, которые будут заимствованы ниже.
    let (four, nine) = (4, 9);

    // Займы (`&`) обеих переменных передаются в функцию.
    print_refs(&four, &nine);
    // Любой заимствованный ввод должен иметь более длительный срок жизни, чем заимствователь.
    // Другими словами, время жизни `four` и `nine` должно быть
    // длиннее, чем время жизни `print_refs`.

    failed_borrow();
    // `failed_borrow` не содержит ссылок, которые могли бы заставить `'a` быть
    // длиннее времени жизни функции, но `'a` длиннее.
    // Поскольку время жизни никогда не ограничивается, оно по умолчанию равно `'static`.
}

Резюме

Поздравляем! Вы завершили лабу по Явной Аннотации. Вы можете практиковаться в других лабах в LabEx, чтобы улучшить свои навыки.