Перейти до основного вмісту
Модуль 6 · Урок 1 із 211/14 у курсі~15 min
Модульні уроки (1/2)

Час життя та посилання

У Rust кожне посилання має час життя, який відповідає області дії, у межах якої це посилання є дійсним. У більшості випадків терміни життя є неявними та виводяться компілятором завдяки правилам виключення часу життя. Однак, коли зв’язок між часом життя різних посилань є неоднозначним, ми повинні чітко їх анотувати.

Основна мета життєвих циклів — запобігти висячим посиланням (посиланням на дані, які вже було вилучено з пам’яті).


Синтаксис анотації за весь час

Довічні імена починаються з апострофа (') і зазвичай складаються з коротких малих літер (наприклад, 'a). Анотації тривалості життя не змінюють фактичну тривалість життя змінних, але вони вказують компілятору зв’язок між дійсністю входів і виходів.

Наприклад, якщо функція приймає два параметри посилання на рядок і повертає посилання на рядок, і ми хочемо, щоб повернуте посилання було дійсним, поки дійсні обидва вхідні параметри, ми використовуємо:

Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

Час життя в структурах даних

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

Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().unwrap();
    let i = ImportantExcerpt {
        part: first_sentence,
    };
}

Статичний термін служби

Термін дії 'static — це особливий термін дії, який триває всю тривалість програми. Усі рядкові літерали (&str) неявно мають 'static час життя, оскільки вони зберігаються безпосередньо в двійковому виконуваному файлі.

Rust
let s: &'static str = "I have a static lifetime.";

Спробуйте самі

Вправа 1: Найдовша функція

вправи#rust.m6.l1.e1
Спроби: 0Завантаження…

Напишіть функцію з назвою longest<'a>, яка приймає два параметри, x типу &'a str і y типу &'a str, і повертає значення типу &'a str. Усередині функції використовуйте блок if/else, щоб повернути x, якщо його довжина більша за y, інакше повернути y.

Завантаження редактора…
Показати підказку

Оголошуйте підпис за допомогою `fn longest<'a>(x: &'a str, y: &'a str) -> &'a str`. Потім використовуйте `if x.len() > y.len() { x } else { y }`.

Рішення доступне після 3 спроб

Вправа 2: Структури з посиланнями

вправи#rust.m6.l1.e2
Спроби: 0Завантаження…

Визначте структуру з іменем Excerpt<'a>, що містить одне поле з назвою part типу &'a str. У головній функції створіть рядкову змінну з іменем text і створіть екземпляр змінної excerpt типу Excerpt, запозичивши посилання на текст. Роздрукувати уривок.частина.

Завантаження редактора…
Показати підказку

Використовуйте `struct Excerpt<'a> { part: &'a str }`. У головному створіть його за допомогою `Excerpt { part: &text }`.

Рішення доступне після 3 спроб

Вправа 3: Статичні посилання

вправи#rust.m6.l1.e3
Спроби: 0Завантаження…

Оголошіть змінну з іменем message з явною анотацією типу для статичного часу життя (&'static str), призначивши їй рядковий літерал. Вивести значення повідомлення.

Завантаження редактора…
Показати підказку

Використовуйте синтаксис `let message: &'static str = 'Messaggio statico!';`, щоб явно анотувати статичний час життя.

Рішення доступне після 3 спроб