Модульні уроки (1/2)
Час життя та посилання
У Rust кожне посилання має час життя, який відповідає області дії, у межах якої це посилання є дійсним. У більшості випадків терміни життя є неявними та виводяться компілятором завдяки правилам виключення часу життя. Однак, коли зв’язок між часом життя різних посилань є неоднозначним, ми повинні чітко їх анотувати.
Основна мета життєвих циклів — запобігти висячим посиланням (посиланням на дані, які вже було вилучено з пам’яті).
Синтаксис анотації за весь час
Довічні імена починаються з апострофа (') і зазвичай складаються з коротких малих літер (наприклад, 'a). Анотації тривалості життя не змінюють фактичну тривалість життя змінних, але вони вказують компілятору зв’язок між дійсністю входів і виходів.
Наприклад, якщо функція приймає два параметри посилання на рядок і повертає посилання на рядок, і ми хочемо, щоб повернуте посилання було дійсним, поки дійсні обидва вхідні параметри, ми використовуємо:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}Час життя в структурах даних
Якщо структура містить поле, яке є посиланням, ми повинні явно зазначити час існування цього посилання, щоб гарантувати, що екземпляр структури не переживе дані, на які він посилається:
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 час життя, оскільки вони зберігаються безпосередньо в двійковому виконуваному файлі.
let s: &'static str = "I have a static lifetime.";Спробуйте самі
Вправа 1: Найдовша функція
Напишіть функцію з назвою 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: Структури з посиланнями
Визначте структуру з іменем Excerpt<'a>, що містить одне поле з назвою part типу &'a str. У головній функції створіть рядкову змінну з іменем text і створіть екземпляр змінної excerpt типу Excerpt, запозичивши посилання на текст. Роздрукувати уривок.частина.
Показати підказку
Використовуйте `struct Excerpt<'a> { part: &'a str }`. У головному створіть його за допомогою `Excerpt { part: &text }`.
Рішення доступне після 3 спроб
Вправа 3: Статичні посилання
Оголошіть змінну з іменем message з явною анотацією типу для статичного часу життя (&'static str), призначивши їй рядковий літерал. Вивести значення повідомлення.
Показати підказку
Використовуйте синтаксис `let message: &'static str = 'Messaggio statico!';`, щоб явно анотувати статичний час життя.
Рішення доступне після 3 спроб