Anexa D - Unelte utile de dezvoltare

În această anexă, vorbim despre unele unelte utile de dezvoltare pe care proiectul Rust le oferă. Vom analiza formatarea automată, modalități rapide de a aplica corecțiile de avertizare, un linter și integrare cu IDE-urile.

Formatare automată cu rustfmt

Instrumentul rustfmt reformatează codul tău conform stilului de codare al comunității. Multe proiecte colaborative utilizează rustfmt pentru a preveni dispute cu privire la stilul de utilizat atunci când se scrie în Rust: toată lumea formatează codul lor folosind acest instrument.

Pentru a instala rustfmt, introdu următorul text:

$ rustup component add rustfmt

Această comandă îți oferă rustfmt și cargo-fmt, similar cum Rust îți oferă atât rustc cât și cargo. Pentru a formata orice proiect Cargo, introduce următorare comandă:

$ cargo fmt

Rularea acestei comenzi reformatează tot codul Rust din crate-ul curent. Aceasta ar trebui să schimbe doar stilul codului, nu și semantica acestuia. Pentru mai multe informații despre rustfmt, consultați documentația sa.

Corectează-ți codul cu rustfix

Instrumentul rustfix este inclus în instalările Rust și poate corecta în mod automat avertismentele compilatorului care au o modalitate clară de corectare, care și este probabil ceea ce vrei. Este posibil să fi văzut avertismente de compilator înainte. De exemplu, ia în considerare acest cod:

Numele fișierului: src/main.rs

fn do_something() {}

fn main() {
    for i in 0..100 {
        do_something();
    }
}

Aici, apelăm funcția do_something de 100 de ori, dar nu folosim niciodată variabila i în corpul buclei for. Rust ne avertizează despre acest lucru:

$ cargo build
   Compiling myprogram v0.1.0 (file:///projects/myprogram)
warning: unused variable: `i`
 --> src/main.rs:4:9
  |
4 |     for i in 0..100 {
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 0.50s

Avertismentul sugerează să folosim _i ca nume în schimb: linia de subliniere indică faptul că intenționăm ca această variabilă să rămână nefolosită. Putem aplica automat această sugestie folosind instrumentul rustfix rulând comanda 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

Când ne uităm din nou la src/main.rs, vedem că cargo fix a modificat codul:

Numele fișierului: src/main.rs

fn do_something() {}

fn main() {
    for _i in 0..100 {
        do_something();
    }
}

Variabila buclei for se numește acum _i, iar avertismentul nu mai apare.

De asemenea, poți utiliza comanda cargo fix pentru a trece codul tău între diferitele ediții ale Rust. Edițiile sunt descrise în Anexa E.

Mai multe lints cu Clippy

Instrumentul Clippy este o colecție de lints care ajută la analiza codului tău Rust. „Lints” se referă la reguli de verificare statică a codului sursă, folosite pentru a identifica erori, inconsecvențe de stil și posibile probleme de performanță sau securitate. Folosind Clippy, poți depista și remedia eficient aceste probleme comune, sporind astfel calitatea codului tău Rust.

Pentru a instala Clippy, introdu următoarea comandă:

$ rustup component add clippy

Pentru a rula lints de la Clippy pe orice proiect Cargo, introdu următoarea comandă:

$ cargo clippy

De exemplu, presupunem că scrii un program care folosește o aproximare a unei constante matematice, precum pi, așa cum face acest program:

Numele fișierului: src/main.rs

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

Rularea cargo clippy pe acest proiect duce la această eroare:

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

Aceasta eroare îți arată că Rust are deja o constantă PI mai precisă definită și că programul tău ar fi mai corect dacă ai folosi constanta respectivă. Atunci ai schimba codul tău pentru a utiliza constanta PI. Următorul cod nu duce la nicio eroare sau avertisment de la Clippy:

Numele fișierului: 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);
}

Pentru mai multe informații despre Clippy, vezi documentația sa.

Integrarea cu IDE folosind rust-analyzer

Pentru a facilita integrarea cu IDE, comunitatea Rust recomandă utilizarea rust-analyzer. Acest instrument este un set de utilitare centrate pe compilator care folosesc protocolul Language Server Protocol, care este o specificație pentru ca IDE-urile și limbajele de programare să comunice între ele. Diferiți clienți pot folosi rust-analyzer, cum ar fi plugin-ul Rust analyzer pentru Visual Studio Code.

Vizitează pagina de acasa a proiectului rust-analyzer pentru instrucțiuni de instalare, apoi instalează suportul pentru serverul de limbaj în propriul tău IDE. IDE-ul tău va obține abilități precum autocompletare, sări la definiție, și erorile inline.