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

Приложение 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

Допустим, вы написали программу, в которой используется приближённое значение математической константы, например числа π:

Файл: 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; после этого установите поддержку языкового сервера в своей IDE. Ваша IDE получит такие возможности, как автодополнение, переход к определению и показ ошибок прямо в коде.