Rust — итоги
Кратко — что стоит унести из раздела "Rust". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации, с которыми сталкиваются новички после раздела. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.
Вопрос. Компилятор: "borrow of moved value" — я же только передал в функцию.
Ответ. Передача по значению для non-Copy типов — move; старая переменная недействительна. Используйте &T / &mut T или .clone() осознанно. Подробнее здесь — типы и владение.
Вопрос. "cannot borrow as mutable more than once at a time".
Ответ. Два активных &mut на один объект запрещены. Сузьте scope, используйте внутреннюю мутацию (RefCell) или перестройте код. Подробнее здесь — типы и владение.
Вопрос. Ошибка lifetime: "does not live long enough".
Ответ. Ссылка не может пережить владельца; часто возвращают ссылку на локальную переменную. Верните owned String или укажите связанные lifetimes в сигнатуре. Подробнее здесь — типы и владение.
Вопрос. Везде поставил .clone() — borrow checker замолчал, код тормозит.
Ответ. Clone — плата за обход модели; сначала попробуйте ссылки, разделение struct на части, Rc/Arc где уместно. Подробнее здесь — типы и владение.
Вопрос. unwrap() в примере сработал, в проде процесс упал.
Ответ. unwrap/expect паникуют на None/Err; в библиотеках и сервисах пробрасывайте Result с ?. Подробнее здесь — ошибки.
Вопрос. ? не работает в main — "the ? operator cannot be applied".
Ответ. main должен возвращать Result<(), E> или обрабатывать ошибку вручную. Подробнее здесь — ошибки, первая программа.
Вопрос. cargo build качает интернет часами на каждом уроке.
Ответ. Первый build компилирует зависимости; дальше кэш в target/. Используйте cargo check для быстрой проверки. Подробнее здесь — Cargo.
Вопрос. Добавил крейт в Cargo.toml, use всё равно "unresolved".
Ответ. Имя в use — путь из lib крейта, не обязательно имя пакета на crates.io. Проверьте docs.rs и feature flags. Подробнее здесь — Cargo.
Вопрос. match на Option — компилятор требует ветку _ хотя cases все перечислены.
Ответ. Для не-exhaustive типов или if let цепочек добавьте недостающий вариант; для enum с полями — bind переменные. Подробнее здесь — управление.
Вопрос. Потоки: "closure may outlive the current function" при thread::spawn.
Ответ. Замыкание должно быть 'static; передайте owned данные или Arc. Ссылки на stack в другой поток нельзя. Подробнее здесь — потоки.
Вопрос. Rc<RefCell<T>> everywhere — код стал как на C++ с shared_ptr.
Ответ. Часто лучше передать владение, каналы (mpsc) или разделить данные без разделяемой мутации. Подробнее здесь — типы и владение, потоки.
Вопрос. Async: future никогда не завершается, программа висит на block_on.
Ответ. Проверьте, что runtime tokio запущен, задачи .awaitятся, нет deadlock на mutex в async. Не смешивайте blocking IO внутри async без spawn_blocking. Подробнее здесь — async.
Вопрос. Axum handler не компилируется — "trait Handler not satisfied".
Ответ. Сигнатура должна быть async, State/Path/Json extractor совместимы; возвращайте impl IntoResponse. Подробнее здесь — Axum.
Вопрос. Serde: "missing field" при JSON с лишними полями с другой стороны.
Ответ. Настройте #[serde(default)], переименование полей, deny_unknown_fields по политике API. Подробнее здесь — трейты.
Вопрос. String vs &str в struct — какой выбрать в API?
Ответ. Struct обычно владеет String; &str в параметрах функций для заимствования входа. Подробнее здесь — типы и владение.
Вопрос. mod в другом файле — "file not found for module".
Ответ. Путь mod foo; ищет foo.rs или foo/mod.rs рядом с родителем; в 2018 edition — иерархия src/lib.rs. Подробнее здесь — синтаксис.
Вопрос. Тест #[test] падает только при cargo test --release.
Ответ. Оптимизация может вскрыть гонки или зависимость от порядка; запустите cargo test --release локально и miri для unsafe. Подробнее здесь — тестирование.
Вопрос. Clippy сотня предупреждений — игнорировать?
Ответ. Пройдите cargo clippy и исправьте idiom suggestions; часть — реальные баги ( needless borrow, float cmp). Подробнее здесь — основы.
Вопрос. unsafe скопировал из интернета — segfault в debug.
Ответ. Unsafe снимает гарантии компилятора; минимизируйте блок, документируйте инварианты, оборачивайте в safe API. Подробнее здесь — FFI.
Вопрос. Пришёл с C++ и жду наследования классов.
Ответ. Композиция + трейты + enum заменяют иерархии; ООП-паттерны показывают идиомы Rust.
Вопрос. iter().map().collect() — тип не выводится.
Ответ. Укажите turbofish collect::<Vec<_>>() или тип переменной слева. Подробнее здесь — управление.
Вопрос. Workspace: пакет A не видит крейт B в том же репо.
Ответ. В Cargo.toml workspace members и path dependency B = { path = "../b" }. Подробнее здесь — Cargo workspace.
Вопрос. GUI на Windows — окно не открывается после cargo run.
Ответ. Проверьте subsystem (console vs windows), зависимости нативной библиотеки и event loop. Подробнее здесь — GUI на Windows.
Вопрос. println! в async handler ломает порядок логов в проде.
Ответ. Используйте tracing/log с уровнями и structured fields. Подробнее здесь — Axum.
Вопрос. Сразу открыл Tokio + Axum, не пройдя владение — "слишком сложно".
Ответ. Маршрут из оглавления: первая программа → владение → ошибки → async → Axum.
Вопрос. panic! в библиотеке — пользователи ругаются на краш.
Ответ. Публичный API возвращает Result; panic только для логически невозможных состояний после документированных инвариантов. Подробнее здесь — ошибки.
Вопрос. #[derive(Debug)] есть, но Display не печатает в format string.
Ответ. {} требует Display; для отладки {:?} или {:#?}. Реализуйте Display вручную или через crate. Подробнее здесь — синтаксис.
Вопрос. cargo install поставил бинарник, терминал его не находит.
Ответ. Добавьте ~/.cargo/bin в PATH (Windows: %USERPROFILE%\.cargo\bin). Перезапустите shell после rustup. Подробнее здесь — первая программа.
Вопрос. Как установить Rust на Windows через rustup?
Ответ. Скачайте rustup-init.exe с rustup.rs, выберите stable toolchain, проверьте rustc --version и cargo --version. Подробнее здесь — первая программа.
Вопрос. Rust для начинающих с нуля — с чего начать бесплатно?
Ответ. первая программа → основы → типы и владение → ошибки по маршруту. Подробнее здесь — что повторить.
Вопрос. Rust vs C++ — что выбрать для системного программирования?
Ответ. Rust даёт безопасность памяти без GC на этапе компиляции; C++ — огромная legacy-база и тонкий контроль. Подробнее здесь — о разделе, C++ — о разделе.
Вопрос. Rust vs Go — скорость и сложность?
Ответ. Go проще войти и быстрее писать сервисы; Rust строже, но предсказуемее по памяти и подходит для CLI, WASM, embedded. Подробнее здесь — Go — о разделе.
Вопрос. Borrow checker Rust — как понять простыми словами?
Ответ. У каждого значения один владелец; ссылки & и &mut с ограничениями по времени жизни исключают гонки и use-after-free. Подробнее здесь — типы и владение.
Вопрос. cargo new cargo build cargo run — шпаргалка команд?
Ответ. cargo new — проект, build — сборка, run — сборка и запуск, test — тесты. Подробнее здесь — Cargo, первая программа.
Вопрос. Option и Result в Rust — зачем нет null?
Ответ. Option<T> явно моделирует отсутствие значения; Result<T, E> — ошибку без исключений. Подробнее здесь — ошибки, управление.
Вопрос. Tokio async Rust tutorial — когда подключать?
Ответ. После владения и Result; для HTTP — Axum на Tokio. Подробнее здесь — async.
Вопрос. Axum web framework Rust — REST API пример?
Ответ. Роутеры, extractors, async handlers; в разделе — практическая статья. Подробнее здесь — Axum.
Вопрос. Сколько учить Rust до первой работы?
Ответ. 3–6 месяцев при регулярной практике: владение, трейты, async и пет-проект на Cargo. Крутая кривая на старте. Подробнее здесь — чек-лист.
Вопрос. Rust зарплата разработчика — востребован ли язык?
Ответ. Растущий спрос в infra, blockchain, CLI, embedded; меньше вакансий, чем Java/Go, выше порог входа. Подробнее здесь — о разделе.
Вопрос. serde json Rust — как сериализовать struct?
Ответ. #[derive(Serialize, Deserialize)] и serde_json::to_string. Подробнее здесь — трейты.
Вопрос. Rust enum vs struct — когда что?
Ответ. Struct — поля данных; enum — варианты состояния (Ok/Err, сообщения). Подробнее здесь — управление, ООП-паттерны.
Вопрос. match Rust exhaustive — обязательны все ветки?
Ответ. Для enum и многих match компилятор требует полноту; _ — осознанный wildcard. Подробнее здесь — управление.
Вопрос. Rust unsafe — когда нужен?
Ответ. FFI, низкоуровневые оптимизации; оборачивайте в safe API. Подробнее здесь — FFI.
Вопрос. WebAssembly Rust — как скомпилировать?
Ответ. Target wasm32-unknown-unknown и toolchain wasm-bindgen; браузерный runtime отдельно. Подробнее здесь — о разделе, Cargo.
Вопрос. Clippy rustfmt — обязательны ли?
Ответ. Стандарт в сообществе: cargo clippy и cargo fmt в CI. Подробнее здесь — основы.
Вопрос. Rust книга на русском — где структурированный курс?
Ответ. Раздел энциклопедии: справочник, итоги, чек-лист. Подробнее здесь — intro.
Вопрос. String from str Rust — как конвертировать?
Ответ. String::from(s), s.to_string(), s.to_owned() для &str; заимствование без аллокации — &str. Подробнее здесь — типы и владение.
Вопрос. Arc Mutex Rust многопоточность — когда использовать?
Ответ. Arc — shared ownership между потоками; Mutex — внутренняя мутация. Сначала попробуйте каналы. Подробнее здесь — потоки.
Вопрос. Rust игровой движок Bevy — с чего начать?
Ответ. После базы владения и Cargo; ECS-подход Bevy — отдельная документация. Фундамент — основы, типы.
Вопрос. lifetime 'a Rust — зачем аннотации в функциях?
Ответ. Связывают ссылки входа и выхода, чтобы компилятор гарантировал, что данные живы. Подробнее здесь — типы и владение.
Вопрос. cargo test unit test пример Rust?
Ответ. #[cfg(test)] mod tests с #[test] или тесты в tests/. Подробнее здесь — тестирование.
Вопрос. Rust сложный язык — стоит ли учить в 2025?
Ответ. Стоит для системного кода, perf-критичных сервисов и карьеры в infra; для простого CRUD быстрее Go или Python. Подробнее здесь — о разделе.
Что запомнить
Rust — это системный язык программирования, сочетающий безопасность памяти без сборщика мусора, высокую производительность и современные средства разработки. Он создан для написания надёжного, конкурентного и эффективного кода, особенно в условиях, где критичны стабильность, безопасность и ресурсная эффективность.
Основные особенности Rust:
- Безопасность памяти во время компиляции (в safe-подмножестве) — владение, заимствование и lifetimes исключают data races, double-free и use-after-free; паники и
unsafe— отдельная зона ответственности; - Отсутствие сборщика мусора: управление памятью осуществляется статически, без рантайм-накладных расходов;
- Нулевая стоимость абстракций: высокоуровневые конструкции не снижают производительность;
- Мощная система типов — включает перечисления (
enum), сопоставление с образцом (match), обобщения (generics); - Встроенная поддержка конкурентности: модель владения и трейты
Send/Syncисключают data races в safe-коде; синхронизация (Mutex, каналы) всё равно нужна там, где данные разделяются намеренно; - Отличные инструменты разработки — Cargo (менеджер пакетов и сборки), Clippy (линтер), rustfmt (форматирование), документация через
rustdoc.
Области применения Rust:
- Системное программирование — ядра ОС, драйверы, встраиваемые системы;
- Веб-бэкенд и микросервисы — Actix, Axum, Rocket обеспечивают высокую пропускную способность;
- CLI-инструменты — ripgrep, exa, bat — примеры популярных утилит на Rust;
- Блокчейн и криптография: безопасность и детерминированность делают Rust предпочтительным выбором;
- WebAssembly: компиляция в WASM позволяет запускать Rust в браузере;
- Игровые движки и графические приложения: благодаря низкоуровневому контролю и производительности.
Экосистема Rust включает:
- Cargo — централизованная система управления зависимостями и сборки;
- crates.io — реестр публичных библиотек ("крейтов");
- Clippy — расширенный линтер, помогающий писать идиоматический код;
- rust-analyzer — современный языковой сервер для IDE;
- tokio, async-std — асинхронные среды выполнения;
- serde — мощная сериализация/десериализация.
Три основных правила эффективной работы с Rust:
- Принять модель владения как фундаментальную — проектировать вокруг него;
- Использовать типы для выражения намерений —
Option,Result,enumвместо null и исключений; - Писать тестируемый код — модульные тесты, интеграционные тесты, doctests — всё встроено в Cargo.
Три фундаментальных момента:
- Rust — это язык, где безопасность и производительность достигаются через строгую статическую проверку, а не через рантайм;
- Его сила — в компиляторе, который выступает как "партнёр по проектированию", а не как препятствие;
- Знание стандартной библиотеки (
std) и экосистемы (tokio,serde,anyhow) критически важно для продуктивной разработки.
Практические главы раздела: Axum, тестирование, потоки, Cargo, FFI, GUI на Windows.
Куда идти дальше
| Тема | Раздел |
|---|---|
| "C++ — о разделе" | "C++ — о разделе" |
| "Ассемблер — о разделе" | "Ассемблер — о разделе" |
| "Системное программирование на C++" | "Системное программирование на C++" |
| "Си — о разделе" | "Си — о разделе" |
Проверьте себя: Чек-лист самопроверки.