BorrowCheck › Ядро языка Rust

Времена жизни, подтипизация, вариантность

Аннотации и правила пропуска, 'static, подтипизация через заменяемость, три вида вариантности, HRTB.

Тема объясняет времена жизни (lifetimes): аннотация 'a не продлевает жизнь значения, а описывает связь между ссылками, которую проверяет компилятор. Вопросы проверяют, когда аннотация обязательна (ссылка в поле структуры, возврат ссылки из функции), что требует граница T: 'a и в каких случаях функцию можно записать без аннотаций по правилам пропуска (lifetime elision). Раздел о 'static различает 'static как время жизни ссылки и как границу T: 'static, разбирает &'static str, требование F: 'static у thread::spawn, неявное + 'static у Box<dyn Trait>, Box::leak и продвижение констант. Разделы о подтипизации (subtyping) и вариантности (variance) показывают, почему &'static str подходит там, где ожидается &'a str, чем ковариантность отличается от контравариантности и инвариантности, почему &mut T инвариантен по T и как вариантность структуры выводится из её полей и PhantomData. Последний раздел посвящён границам высшего ранга (HRTB): смыслу for<'a> в ограничении, записи Fn(&T) -> &U и случаям, когда замыкание, возвращающее ссылку, не компилируется без явной границы.

38 вопросов: базовый уровень — 16, средний — 17, углублённый — 5. 6 справок, 16 источников.

Разделы

  1. Аннотации и синтаксис
  2. Правила пропуска
  3. 'static: тип и граница
  4. Подтипизация и заменяемость
  5. Вариантность: ко-, контра-, инвариантность
  6. Границы высшего ранга (HRTB)

Предыдущая тема: Заимствование, ссылки, NLL · Следующая тема: Структуры, перечисления, сопоставление