Правила вывода времён жизни
Когда времена жизни выводятся автоматически
«Правила вывода времён жизни» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.
Время жизни, которое не нужно указывать
Многие функции принимают и возвращают ссылки без аннотаций времени жизни, но при этом компилируются. Это происходит благодаря автоматическому выводу времени жизни: компилятор самостоятельно выводит очевидные времена жизни.
Автоматический вывод — это лишь сокращение
Автоматический вывод не устраняет времена жизни: компилятор всё равно подставляет их за кулисами, используя несколько детерминированных правил. Если правила подходят для Вашего случая, аннотации можно опустить.
Функция с выведенным временем жизни
У этой функции нет явно указанных времён жизни, однако компилятор понимает, что возвращаемая ссылка заимствует данные из входного параметра. Правила делают это однозначным.
fn first_word(s: &str) -> &str {
s.split(' ').next().unwrap_or("")
}
fn main() {
let phrase = String::from("rust is fun");
println!("{}", first_word(&phrase));
}Правило 1: каждому входному параметру — своё время жизни
Первое правило: каждому времени жизни, опущенному в параметрах, присваивается отдельное время жизни. Два параметра-ссылки получают два разных времени жизни.
Правило 2: один входной параметр — один выходной
Второе правило: если имеется ровно одно входное время жизни, оно присваивается всем выходным временам жизни. Это относится к функциям вроде first_word, которые принимают и возвращают одну ссылку.
fn trim_start(s: &str) -> &str {
s.trim_start()
}
fn main() {
println!("[{}]", trim_start(" hi"));
}Правило 3: методы и &self
Третье правило: если метод содержит &self или &mut self, время жизни self присваивается всем выходным временам жизни. Поэтому методы редко требуют аннотаций.
struct Holder { value: String }
impl Holder {
fn get(&self) -> &str {
&self.value
}
}
fn main() {
let h = Holder { value: String::from("stored") };
println!("{}", h.get());
}Когда автоматический вывод не работает
Если после применения всех трёх правил время жизни какого-либо выходного значения всё ещё неизвестно, компилятор просит указать его явно. Функция longest — классический пример: два входных параметра и неоднозначный результат.
Функция longest ещё раз
Два входных параметра-ссылки и один выходной параметр-ссылка: правило 2 не применяется (входных параметров больше одного), а self отсутствует. Поэтому необходимо добавить аннотацию.
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
fn main() {
println!("{}", longest("abcd", "ab"));
}Несколько входных параметров, результат из self
Метод с несколькими параметрами всё равно получает время жизни результата из self по правилу 3, даже если существуют другие параметры-ссылки.
struct Doc { body: String }
impl Doc {
fn announce(&self, _note: &str) -> &str {
&self.body
}
}
fn main() {
let d = Doc { body: String::from("content") };
println!("{}", d.announce("ping"));
}Зачем нужны эти правила
Эти три правила охватывают подавляющее большинство реального кода, поэтому большинству функций синтаксис времени жизни вообще не нужен. Аннотации указываются только тогда, когда намерение действительно неоднозначно.
Краткий список проверки
Чтобы определить, применим ли автоматический вывод, спросите себя:
- Есть ровно одна входная ссылка? Результат заимствует данные из неё.
- Есть
&self? Результат заимствует данные из self. - В противном случае укажите время жизни явно.
Быстрая проверка
Проверьте, понимаете ли Вы правила автоматического вывода.
Итоги
Вы узнали, когда время жизни выводится автоматически:
- Правило 1: каждая входная ссылка получает собственное время жизни
- Правило 2: одно входное время жизни распространяется на все выходные
- Правило 3:
&selfзадаёт время жизни результата в методах - Если результат остаётся неоднозначным, время жизни указывается явно
Часто задаваемые вопросы
Урок «Правила вывода времён жизни» бесплатный?
Да — полный текст урока «Правила вывода времён жизни» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.
Чему я научусь в уроке «Правила вывода времён жизни»?
Когда времена жизни выводятся автоматически Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Правила вывода времён жизни»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны времена жизни
- Аннотации времён жизни
- Времена жизни в структурах
- Правила вывода времён жизни