Приложение D: полезные инструменты разработки
В этом приложении мы поговорим о полезных инструментах разработки, которые предоставляет проект Rust: автоматическом форматировании, быстром способе применить исправления предупреждений, линтере и интеграции с IDE.
Автоматическое форматирование с rustfmt
Инструмент rustfmt переформатирует код в соответствии со стилем, принятым в
сообществе. Многие совместные проекты используют rustfmt, чтобы не спорить о
стиле кода на Rust: все форматируют код этим инструментом.
rustfmt входит в стандартную установку Rust, так что программы 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
Допустим, вы написали программу, в которой используется приближённое значение математической константы, например числа π:
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 ни ошибок, ни предупреждений:
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; после этого установите поддержку языкового сервера
в своей IDE. Ваша IDE получит такие возможности, как автодополнение, переход к
определению и показ ошибок прямо в коде.