Приложение D: Полезные инструменты для разработки

В этом приложении мы рассмотрим некоторые полезные инструменты для разработки, предоставляемые проектом Rust. Мы изучим автоматическое форматирование, быстрые способы применения исправлений предупреждений, линтер и интеграцию с IDE.

Автоматическое форматирование с помощью rustfmt

Инструмент rustfmt переформатирует ваш код в соответствии с общепринятым стилем сообщества. Многие совместные проекты используют rustfmt, чтобы предотвратить споры о том, какой стиль использовать при написании кода на Rust: каждый форматирует свой код с помощью этого инструмента.

Установки Rust включают rustfmt по умолчанию, поэтому у вас уже должны быть программы rustfmt и cargo-fmt в вашей системе. Эти две команды аналогичны rustc и cargo в том смысле, что rustfmt позволяет более детальный контроль, а cargo-fmt понимает соглашения проектов, использующих Cargo. Чтобы отформатировать любой проект Cargo, введите следующее:

$ cargo fmt

Запуск этой команды переформатирует весь Rust-код в текущем крейте. Это должно изменить только стиль кода, а не его семантику. Для получения дополнительной информации о rustfmt см. его документацию.

Исправление кода с помощью rustfix

Инструмент rustfix входит в состав установки Rust и может автоматически исправлять предупреждения компилятора, для которых существует четкий способ решения проблемы, вероятно соответствующий вашим ожиданиям. Вы, вероятно, уже видели предупреждения компилятора. Например, рассмотрим этот код:

Файл: src/main.rs

fn main() {
    let mut x = 42;
    println!("{x}");
}

Здесь мы определяем переменную x как изменяемую, но никогда фактически не изменяем ее. Rust предупреждает нас об этом:

$ cargo build
   Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
2 |     let mut x = 0;
  |         ----^
  |         |
  |         help: remove this `mut`
  |
  = note: `#[warn(unused_mut)]` on by default

Предупреждение предлагает нам удалить ключевое слово mut. Мы можем автоматически применить это предложение с помощью инструмента rustfix, выполнив команду cargo fix:

$ cargo fix
    Checking myprogram v0.1.0 (file:///projects/myprogram)
      Fixing src/main.rs (1 fix)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s

Когда мы снова посмотрим на src/main.rs, мы увидим, что cargo fix изменил код:

Файл: src/main.rs

fn main() {
    let x = 42;
    println!("{x}");
}

Переменная x теперь неизменяема, и предупреждение больше не появляется.

Вы также можете использовать команду cargo fix для перевода вашего кода между различными редакциями Rust. Редакции рассматриваются в Приложении E.

Дополнительные проверки с Clippy

Инструмент Clippy — это набор линт (проверок) для анализа вашего кода, чтобы вы могли находить распространенные ошибки и улучшать свой Rust-код. Clippy входит в стандартную установку Rust.

Чтобы запустить проверки Clippy на любом проекте Cargo, введите следующее:

$ cargo clippy

Например, предположим, вы написали программу, которая использует приближение математической константы, такой как π (пи), как в этой программе:

Файл: src/main.rs

fn main() {
    let x = 3.1415;
    let r = 8.0;
    println!("the area of the circle is {}", x * r * r);
}

Запуск cargo clippy для этого проекта приводит к такой ошибке:

error: approximate value of `f{32, 64}::consts::PI` found
 --> src/main.rs:2:13
  |
2 |     let x = 3.1415;
  |             ^^^^^^
  |
  = note: `#[deny(clippy::approx_constant)]` on by default
  = help: consider using the constant directly
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant

Эта ошибка сообщает вам, что в Rust уже определена более точная константа PI, и ваша программа была бы более корректной, если бы вы использовали эту константу. Затем вы должны изменить свой код для использования константы PI.

Следующий код не вызывает ошибок или предупреждений от Clippy:

Файл: src/main.rs

fn main() {
    let x = std::f64::consts::PI;
    let r = 8.0;
    println!("the area of the circle is {}", x * r * r);
}

Для получения дополнительной информации о Clippy см. его документацию.

Интеграция с IDE с помощью rust-analyzer

Для помощи в интеграции с IDE сообщество Rust рекомендует использовать rust-analyzer. Этот инструмент представляет собой набор утилит, ориентированных на компилятор, которые используют Language Server Protocol — спецификацию для взаимодействия IDE и языков программирования друг с другом. Различные клиенты могут использовать rust-analyzer, такие как плагин Rust analyzer для Visual Studio Code.

Посетите домашнюю страницу проекта rust-analyzer для получения инструкций по установке, затем установите поддержку language server в вашей конкретной IDE. Ваша IDE получит такие возможности, как автодополнение, переход к определению и встроенные ошибки.