Модуль 3 · Команды Cargo
Проверка и форматирование
cargo check, cargo fmt и cargo clippy — три команды которые сделают ваш код быстрее, чище и правильнее.
🛠️ Практика
🕐 ~15 минут
🔍
cargo check — быстрая проверка без сборки
cargo check анализирует код на ошибки типов и синтаксис без создания бинарника. Работает в 2–5 раз быстрее cargo build. Используйте во время написания кода для мгновенной обратной связи.
Терминал
cargo check # проверить src/
cargo check --tests # проверить включая тесты
cargo check --all # проверить все крейты в воркспейсе
💡 Профессиональный цикл разработки: пишете код →
cargo check → исправляете → cargo check → когда ошибок нет → cargo run или cargo test.
🎨
cargo fmt — автоформатирование
cargo fmt автоматически форматирует весь код по официальному стандарту Rust (rustfmt). Больше не нужно спорить про отступы, пробелы и переносы строк.
Терминал
cargo fmt # форматировать весь проект (изменяет файлы)
cargo fmt --check # только проверить, не менять (для CI)
cargo fmt -- --emit stdout # вывести отформатированный код в stdout
Настройка форматирования через файл rustfmt.toml в корне проекта:
rustfmt.toml
max_width = 100 # максимальная длина строки (по умолчанию 80)
tab_spaces = 4 # размер отступа
edition = "2021" # версия Rust для парсинга
💡 В командах CI всегда добавляйте
cargo fmt --check. Если кто-то закоммитит неотформатированный код — CI упадёт. Это стандарт во всех серьёзных Rust-проектах.
📎
cargo clippy — умный линтер
Clippy — это линтер с более чем 700 правилами. Находит код который компилируется, но написан неидиоматично, неэффективно или потенциально опасно.
Терминал
cargo clippy # запустить clippy
cargo clippy --fix # автоматически исправить что можно
cargo clippy -- -D warnings # трактовать предупреждения как ошибки (для CI)
cargo clippy --all-targets # проверить тесты, бенчмарки и примеры тоже
Пример того, что находит clippy:
Пример предупреждений clippy
# Clippy скажет: используйте .is_empty() вместо .len() == 0
if my_vec.len() == 0 { } // ← предупреждение
if my_vec.is_empty() { } // ← правильно
# Clippy скажет: .clone() на Copy-типе избыточен
let x: i32 = 5;
let y = x.clone(); // ← предупреждение
let y = x; // ← правильно (i32 копируется автоматически)
# Clippy скажет: используйте if let вместо match с одной веткой
match opt {
Some(x) => println!("{x}"),
_ => {} // ← предупреждение
}
💡 Отключить конкретное предупреждение clippy на уровне функции:
#[allow(clippy::имя_предупреждения)]. Отключать целиком не стоит — clippy находит реальные проблемы.
📌 Что важно запомнить
→ cargo check — быстрая проверка ошибок без создания бинарника
→ cargo fmt — автоформатирование; cargo fmt --check — только проверка (для CI)
→ cargo clippy — 700+ правил для идиоматичного Rust-кода
→ В CI: всегда запускайте fmt --check и clippy -- -D warnings