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

Трейты, обобщения, dyn / impl

Определение трейтов, мономорфизация, dyn Trait против impl Trait, dyn-совместимость, когерентность.

Тема объясняет трейты как описание общего поведения типов и обобщения (generics) как способ писать код для многих типов сразу. Вопросы проверяют правила реализации и вызова: трейт должен быть в области видимости, собственный метод типа выбирается раньше метода трейта, а при совпадении имён нужен полный путь. Раздел об обобщениях разбирает ограничения трейтами (trait bounds) и мономорфизацию: компилятор создаёт отдельную копию функции для каждого набора типов, выигрывая в скорости и проигрывая в размере кода. Затем сравниваются impl Trait и dyn Trait: один скрытый конкретный тип против объекта трейта (trait object) с таблицей виртуальных методов, из чего следуют правила dyn-совместимости (dyn compatibility) для методов с Self, обобщёнными параметрами и оговоркой where Self: Sized. Раздел о когерентности (coherence) объясняет правило сироты (orphan rule), обобщённые реализации (blanket impls) и обёртку newtype для чужого трейта на чужом типе. Последний раздел посвящён методам по умолчанию и супертрейтам: что даёт ограничение на подтрейт и когда нужна реализация супертрейта.

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

Разделы

  1. Определение и реализация трейтов
  2. Обобщения и мономорфизация
  3. dyn Trait против impl Trait
  4. Объектная безопасность (dyn-compatibility)
  5. Когерентность и правило сироты
  6. Методы по умолчанию и супертрейты

Предыдущая тема: Строки и текст · Следующая тема: Ассоциированные типы, GAT, const generics