付録D: 便利な開発ツール
この付録では、Rust プロジェクトが提供している便利な開発ツールをいくつか取り上げます。自動フォーマット、警告の修正をすばやく適用する方法、リンター、そして IDE との統合について見ていきます。
rustfmt による自動フォーマット
rustfmt ツールは、コミュニティのコードスタイルに従ってコードを再フォーマットします。多くの共同開発プロジェクトでは、Rust を書くときにどのスタイルを使うかでもめないように rustfmt を使っています。全員がこのツールを使ってコードをフォーマットするからです。
Rust のインストールにはデフォルトで rustfmt が含まれているので、システムにはすでに rustfmt と cargo-fmt のプログラムがあるはずです。この 2 つのコマンドは 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 キーワードを削除するよう提案しています。cargo fix コマンドを実行すれば、rustfix ツールを使ってその提案を自動的に適用できます。
$ 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 による追加の lint
Clippy ツールは、コードを解析して一般的なミスを見つけ、Rust コードを改善するための lint 集です。Clippy は標準的な Rust のインストールに含まれています。
任意の Cargo プロジェクトで Clippy の lint を実行するには、次を入力します。
$ 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 の詳細については、そのドキュメントを参照してください。
rust-analyzer を使った IDE 統合
IDE との統合を支援するために、Rust コミュニティは rust-analyzer の使用を推奨しています。このツールは、Language Server Protocol を話す、コンパイラ中心のユーティリティ群です。これは、IDE とプログラミング言語が相互に通信するための仕様です。rust-analyzer は、Visual Studio Code 用 Rust analyzer プラグイン など、さまざまなクライアントから利用できます。
rust-analyzer プロジェクトの ホームページ
にアクセスしてインストール手順を確認し、その後、使っている IDE に言語サーバーのサポートをインストールしてください。IDE では、自動補完、定義へのジャンプ、インラインエラーなどの機能が使えるようになります。