Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Паттерны Rust и практические руководства по инженерии

О проекте

  • Курс основан на оригинальных материалах Rust Training. Лицензии: MIT (код) и CC-BY-4.0 (текст).
  • Русский перевод и адаптация выполнены участниками проекта RustTraining-Rus.
  • Замечания и исправления присылайте через Issues и Pull Requests репозитория.

Практическое руководство по паттернам Rust уровня «средний и выше», которые возникают в реальных кодовых базах. Это не учебник по языку: предполагается, что вы уже умеете писать простой код на Rust и хотите перейти на следующий уровень. Каждая глава посвящена одной концепции, объясняет, когда и зачем её применять, и содержит компилируемые примеры с упражнениями прямо в тексте.

Для кого эта книга

  • Разработчики, которые прошли The Rust Programming Language, но не понимают, как на практике спроектировать решение
  • Инженеры, переносящие промышленные системы с C++ и C# на Rust
  • Все, кто упёрся в стену с обобщёнными типами, границами трейтов или ошибками времён жизни и хочет систематический набор инструментов

Предварительные требования

Прежде чем начать, вам стоит уверенно владеть:

  • владением, заимствованием и временами жизни (базовый уровень)
  • перечислениями, сопоставлением с образцом и Option/Result
  • структурами, методами и базовыми трейтами (Display, Debug, Clone)
  • основами Cargo: cargo build, cargo test, cargo run

Как пользоваться этой книгой

Обозначения сложности

Каждая глава помечена уровнем сложности:

СимволУровеньЗначение
🟢ОсновыБазовые концепции, которые нужны каждому разработчику на Rust
🟡СреднийПаттерны, которые применяются в промышленных кодовых базах
🔴ПродвинутыйГлубинные механизмы языка: возвращайтесь к ним по мере необходимости

План изучения

ГлавыТемаРекомендуемое времяКонтрольная точка
Часть I: Паттерны на уровне типов
1. Обобщённые типы 🟢Мономорфизация, const-обобщения, const fn1–2 часаМожет объяснить, когда dyn Trait предпочтительнее обобщений
2. Трейты 🟡Ассоциированные типы, GAT, blanket-реализации, vtable3–4 часаМожет спроектировать трейт с ассоциированными типами
3. Newtype и type-state 🟡Безопасность типов без затрат во время выполнения, автоматы на этапе компиляции2–3 часаМожет реализовать builder-паттерн на основе type-state
4. PhantomData 🔴Маркировка времён жизни, вариантность, проверка drop2–3 часаМожет объяснить, почему PhantomData<fn(T)> отличается от PhantomData<T>
Часть II: Конкурентность и рантайм
5. Каналы 🟢mpsc, crossbeam, select!, акторы1–2 часаМожет реализовать пул воркеров на каналах
6. Конкурентность 🟡Потоки, rayon, Mutex, RwLock, атомарные типы2–3 часаМожет подобрать подходящий примитив синхронизации для задачи
7. Замыкания 🟢Fn/FnMut/FnOnce, комбинаторы1–2 часаМожет написать функцию высшего порядка, принимающую замыкания
8. Функциональный и императивный стили 🟡Цепочки итераторов, комбинаторы Option и Result, когда выбирать цикл2–3 часаМожет объяснить, когда комбинатор понятнее цикла, а когда нет
9. Умные указатели 🟡Box, Rc, Arc, RefCell, Cow, Pin2–3 часаМожет объяснить, когда применять каждый умный указатель
Часть III: Системы и продакшн
10. Обработка ошибок 🟢thiserror, anyhow, оператор ?1–2 часаМожет спроектировать иерархию типов ошибок
11. Сериализация 🟡serde, zero-copy, бинарные данные2–3 часаМожет написать собственный десериализатор serde
12. Unsafe 🔴Сверхспособности, FFI, подводные камни UB, аллокаторы2–3 часаМожет обернуть unsafe-код в корректный безопасный API
13. Макросы 🟡macro_rules!, процедурные макросы, syn/quote2–3 часаМожет написать декларативный макрос с tt munching
14. Тестирование 🟢Модульные, интеграционные и doc-тесты, proptest, criterion1–2 часаМожет настроить property-based тесты
15. Дизайн API 🟡Структура модулей, эргономичные API, флаги функций2–3 часаМожет применить паттерн «parse, don’t validate»
16. Async 🔴Futures, Tokio, распространённые ошибки1–2 часаМожет находить анти-паттерны async
Приложения
Справочная карточкаКраткая сводка по границам трейтов, временам жизни и паттернамПо необходимости—
Итоговый проектПланировщик задач с безопасностью типов4–6 часовСдайте работающую реализацию

Общее расчётное время: 30–45 часов для основательного изучения с упражнениями.

Работа с упражнениями

Каждая глава заканчивается практическим упражнением. Чтобы извлечь из книги максимум:

  1. Сначала попробуйте сами: потратьте минимум 15 минут, прежде чем открывать решение
  2. Набирайте код: не копируйте и не вставляйте, набор текста вырабатывает мышечную память
  3. Меняйте решение: добавьте функциональность, измените ограничение, намеренно что-нибудь сломайте
  4. Проверяйте перекрёстные ссылки: большинство упражнений сочетают паттерны из нескольких глав

Итоговый проект (в приложении) объединяет паттерны из всей книги в одну систему промышленного качества.

Оглавление

Часть I: Паттерны на уровне типов

1. Обобщённые типы — полная картина 🟢 Мономорфизация, компромиссы по размеру кода, обобщения против перечислений и трейт-объектов, const-обобщения, const fn.

2. Трейты в деталях 🟡 Ассоциированные типы, GAT, blanket-реализации, маркерные трейты, vtable, HRTB, трейты-расширения, диспетчеризация через перечисления.

3. Паттерны newtype и type-state 🟡 Безопасность типов без затрат во время выполнения, автоматы состояний на этапе компиляции, builder-паттерны, конфигурационные трейты.

4. PhantomData — типы, которые не несут данных 🔴 Маркировка времён жизни, паттерн «единицы измерения», проверка drop, вариантность.

Часть II: Конкурентность и рантайм

5. Каналы и передача сообщений 🟢 std::sync::mpsc, crossbeam, select!, обратное давление (backpressure), паттерн актора.

6. Конкурентность, параллелизм и потоки 🟡 Потоки ОС, scoped-потоки, rayon, Mutex/RwLock/атомарные типы, Condvar, OnceLock, паттерны без блокировок.

7. Замыкания и функции высшего порядка 🟢 Fn/FnMut/FnOnce, замыкания как параметры и возвращаемые значения, комбинаторы, API высшего порядка.

8. Функциональный и императивный стили: когда выигрывает изящество 🟡 Комбинаторы Option и Result, цепочки итераторов против циклов, оператор ?, построение коллекций, антипаттерны.

9. Умные указатели и внутренняя изменяемость 🟡 Box, Rc, Arc, Weak, Cell/RefCell, Cow, Pin, ManuallyDrop.

Часть III: Системы и продакшн

10. Паттерны обработки ошибок 🟢 thiserror против anyhow, #[from], .context(), оператор ?, паника.

11. Сериализация, zero-copy и бинарные данные 🟡 Основы serde, представления перечислений, десериализация без копирования, repr(C), bytes::Bytes.

12. Unsafe Rust — контролируемая опасность 🔴 Пять сверхспособностей, корректные абстракции, FFI, подводные камни UB, аллокаторы на основе арен и slab-аллокаторы.

13. Макросы — код, который пишет код 🟡 macro_rules!, когда (не) стоит использовать макросы, процедурные макросы, derive-макросы, syn/quote.

14. Паттерны тестирования и бенчмаркинга 🟢 Модульные, интеграционные и doc-тесты, proptest, criterion, стратегии моков.

15. Архитектура крейтов и дизайн API 🟡 Структура модулей, чек-лист дизайна API, эргономичные параметры, флаги функций, воркспейсы.

16. Основы async/await 🔴 Futures, быстрый старт с Tokio, распространённые ошибки. (Подробнее об async см. в нашем курсе по Async Rust.)

17. Упражнения Сводный набор упражнений по главам книги.

Приложения

Итоги и справочная карточка Руководство по выбору паттерна, шпаргалка по границам трейтов, правила elision времён жизни, дополнительная литература.

Итоговый проект: планировщик задач с безопасностью типов Объединение обобщённых типов, трейтов, typestate, каналов, обработки ошибок и тестирования в единую систему.