Зачем нужны времена жизни
Предотвращение висячих ссылок
«Зачем нужны времена жизни» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Ссылки должны оставаться действительными
Ссылка заимствует данные, которыми не владеет. Rust должен гарантировать, что данные живут не меньше ссылки. Время жизни — это механизм, с помощью которого компилятор отслеживает это.
Их задача — предотвращать висячие ссылки.
Что такое висячая ссылка
Висячая ссылка указывает на уже освобождённую память. В языках без проверок её использование приводит к сбоям или уязвимостям. Rust отказывается компилировать такой код.
Проверка заимствований в действии
Этот код создал бы ссылку на значение, выходящее из области видимости. Rust отклоняет его во время компиляции. Время жизни — это правило, которым он руководствуется.
fn main() {
let r;
{
let x = 5;
r = &x;
println!("inside: {}", r);
}
// using r here would be a dangling reference
println!("done");
}Области видимости определяют время жизни
Время жизни значения — это период, когда оно действительно, обычно его область видимости. Ссылка не должна жить дольше значения, на которое она указывает.
Здесь и x, и ссылка живут в одной области видимости, поэтому всё корректно.
fn main() {
let x = 5;
let r = &x;
println!("x is {}, r is {}", x, r);
}Возврат ссылок
Функция, возвращающая ссылку, должна вернуть ссылку, которая останется действительной для вызывающего кода. Нельзя вернуть ссылку на локальную переменную, потому что она прекращает существование при завершении функции.
Возврат заимствованных входных данных
Можно вернуть ссылку, заимствующую данные из входного значения. Результат будет действителен столько же, сколько и это входное значение. Именно это описывают аннотации времени жизни.
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
if b == b' ' {
return &s[..i];
}
}
s
}
fn main() {
let sentence = String::from("hello world");
println!("{}", first_word(&sentence));
}Время жизни существует только во время компиляции
Время жизни — это исключительно понятие времени компиляции. Оно не добавляет накладных расходов во время выполнения и существует только для проверки безопасности памяти анализатором заимствований.
Владение и время жизни
Владение определяет, кто освобождает значение, а время жизни — как долго могут существовать заимствования этого значения. Вместе они позволяют Rust гарантировать безопасность без сборщика мусора.
fn main() {
let data = vec![1, 2, 3];
let view = &data[0..2];
println!("{:?}", view);
// data still owns the vector; view just borrows part of it
println!("{:?}", data);
}Почему имена появляются в сигнатурах
Когда функция принимает несколько ссылок, компилятор иногда не может определить, как связаны их времена жизни. Тогда Вы добавляете аннотации времени жизни, чтобы уточнить эти связи.
В следующем уроке рассматривается этот синтаксис.
Преимущества
Благодаря времени жизни целая категория ошибок — использование после освобождения, висячие указатели и недействительность итераторов — просто не может скомпилироваться. Вы получаете скорость на уровне C и безопасность памяти.
Ментальная модель
Представьте время жизни как метку продолжительности существования данных. Ссылка содержит ограничение: она действительна только пока существуют её исходные данные. Проверяющий заимствования обеспечивает это правило.
Быстрая проверка
Проверьте, понимаете ли Вы, зачем нужно время жизни.
Итоги
Вы узнали, зачем нужно время жизни:
- Ссылки не должны существовать дольше данных, которые они заимствуют
- Время жизни предотвращает висячие ссылки на этапе компиляции
- Оно существует только на этапе компиляции и не создаёт затрат во время выполнения
- Оно работает вместе с владением, обеспечивая безопасность памяти без сборщика мусора
Часто задаваемые вопросы
Урок «Зачем нужны времена жизни» бесплатный?
Да — полный текст урока «Зачем нужны времена жизни» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Зачем нужны времена жизни»?
Предотвращение висячих ссылок Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Зачем нужны времена жизни»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны времена жизни
- Аннотации времён жизни
- Времена жизни в структурах
- Правила вывода времён жизни