Anhang D: Nützliche Entwicklungswerkzeuge
In diesem Anhang sprechen wir über einige nützliche Entwicklungswerkzeuge, die das Rust-Projekt bietet. Wir werden uns mit automatischer Formatierung, schnellen Möglichkeiten zum Beheben von Warnhinweisen, einem Tool zur statischen Code-Analyse (linter) und der Integration in integrierte Entwicklungsumgebungen (IDEs) befassen.
Automatische Formatierung mit rustfmt
Das Tool rustfmt
formatiert deinen Code entsprechend des
Gemeinschafts-Codestils. Viele kollaborative Projekte verwenden rustfmt
, um
Diskussionen zum Stil beim Schreiben von Rust zu vermeiden: Jeder formatiert
seinen Code mithilfe des Tools.
Rust-Installationen enthalten standardmäßig rustfmt, daher solltest du die
Programme rustfmt
und cargo-fmt
bereits auf deinem System haben. Diese
beiden Befehle funktionieren analog zu rustc
und cargo
, wobei rustfmt
eine feingranularere Steuerung erlaubt und cargo-fmt
die Konventionen eines
Projekts versteht, das Cargo verwendet. Um ein beliebiges Cargo-Projekt zu
formatieren, gibst du Folgendes ein:
$ cargo fmt
Mit diesem Befehl wird der gesamte Rust-Code in der aktuellen Kiste neu
formatiert. Dies sollte nur den Stil des Codes ändern, nicht die Semantik des
Codes. Weitere Informationen zu rustfmt
findest du in seiner
Dokumentation.
Korrigiere deinen Code mit rustfix
Das Werkzeug rustfix
ist in Rust-Installationen enthalten und kann
automatisch Compiler-Warnungen beheben, die eine klare Möglichkeit haben, das
Problem zu beheben, was wahrscheinlich das ist, was du willst. Wahrscheinlich
hast du schon einmal Compiler-Warnungen gesehen. Betrachte zum Beispiel diesen
Code:
Dateiname: src/main.rs
fn main() { let mut x = 42; println!("{x}"); }
Hier definieren wir die Variable x
als veränderbar, aber wir verändern sie nie
wirklich. Rust warnt uns vor dieser Tatsache:
$ 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
Die Warnung empfiehlt, dass wir das Schlüsselwort mut
entfernen. Wir können
diesen Vorschlag automatisch mit dem Werkzeug rustfix
übernehmen, indem wir
den Befehl cargo fix
ausführen:
Die Warnung empfiehlt, stattdessen _i
als Namen zu verwenden: Der Unterstrich
zeigt an, dass wir diese Variable nicht verwenden wollen. Wir können diesen
Vorschlag mit dem Werkzeug rustfix
automatisch übernehmen, indem wir das
Kommando cargo fix
ausführen:
$ cargo fix
Checking myprogram v0.1.0 (file:///projects/myprogram)
Fixing src/main.rs (1 fix)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
Wenn wir uns src/main.rs noch einmal ansehen, werden wir sehen, dass
cargo fix
den Code geändert hat:
Dateiname: src/main.rs
fn main() { let x = 42; println!("{x}"); }
Die Variable x
ist jetzt unveränderlich, und die Warnung erscheint nicht
mehr.
Du kannst den Befehl cargo fix
auch dazu verwenden, deinen Code zwischen
verschiedenen Rust-Ausgaben zu konvertieren. Die Ausgaben sind in Anhang
E aufgeführt.
Mehr statische Codeanalyse mit Clippy
Das Tool Clippy ist eine Sammlung von Tools zur statischen Codeanalyse, mit dem du häufige Fehler aufspüren und deinen Rust-Code verbessern kannst. Clippy ist in den Standardinstallationen von Rust enthalten.
Um Clippy bei einem Cargo-Projekt auszuführen, gib folgendes ein:
$ cargo clippy
Angenommen, du schreibst ein Programm, das eine Annäherung an eine mathematische Konstante wie Pi verwendet, wie dieses Programm es tut:
Dateiname: src/main.rs
fn main() { let x = 3.1415; let r = 8.0; println!("Die Kreisfläche ist {}", x * r * r); }
Das Ausführen von cargo clippy
in diesem Projekt führt zu diesem Fehler:
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
Dieser Fehler weist dich darauf hin, dass in Rust bereits eine präzisere
Konstante PI
definiert ist und dass dein Programm korrekter wäre, wenn du
stattdessen diese Konstante verwenden würdest. Du würdest dann deinen Code
ändern, um die Konstante PI
zu verwenden. Der folgende Code führt zu keinen
Fehlern oder Warnungen von Clippy:
Dateiname: src/main.rs
fn main() { let x = std::f64::consts::PI; let r = 8.0; println!("Die Kreisfläche ist {}", x * r * r); }
Für weitere Informationen über Clippy siehe seine Dokumentation.
IDE-Integration mittels rust-analyzer
Um die IDE-Integration zu erleichtern, empfiehlt die Rust-Gemeinschaft die
Verwendung des rust-analyzer
. Bei diesem Werkzeug handelt es
sich um eine Reihe von Compiler-zentrierten Hilfsprogrammen, die das
Sprach-Server-Protokoll (Language Server Protocol) beherrschen, eine
Spezifikation für IDEs und Programmiersprachen zur Kommunikation untereinander.
Verschiedene Clients können rust-analyzer
verwenden, wie zum Beispiel das
Rust-Plugin für Visual Studio Code.
Besuche die Homepage des Projekts rust-analyzer
, um
Installationsanweisungen zu erhalten, und installiere dann die
Sprachserver-Unterstützung in deiner speziellen IDE. Deine IDE wird
Fähigkeiten wie Autovervollständigung, Sprung zur Definition und im Code
eingeblendete Fehlermeldungen erhalten.