付録D - 便利な開発ツール

この付録では、Rustプロジェクトの提供する便利な開発ツールについていくつかお話します。 自動フォーマット、警告に対する修正をすばやく適用する方法、lintツール、そしてIDEとの統合について見ていきます。

rustfmtを使った自動フォーマット

rustfmtというツールは、コミュニティのコードスタイルに合わせてあなたのコードをフォーマットしてくれます。 Rustを書くときにどのスタイルを使うかで揉めないように、多くの共同で行われるプロジェクトがrustfmtを使っています:全員がこのツールでコードをフォーマットするのです。

rustfmtをインストールするには、以下を入力してください:

$ rustup component add rustfmt

これでrustfmtcargo-fmtが使えるようになります。これはrustccargoの両方のコマンドがあるのと似たようなものです。 どんなCargoのプロジェクトも、次を入力するとフォーマットできます:

$ cargo fmt

このコマンドを実行すると、現在のクレートのあらゆるRustコードをフォーマットし直します。 これを行うと、コードのスタイルのみが変わり、コードの意味は変わりません。 rustfmtについてより詳しく知るにはドキュメントを読んでください。

rustfixでコードを修正する

rustfixというツールはRustをインストールすると同梱されており、コンパイラの警告 (warning) を自動で直してくれます。 Rustでコードを書いたことがある人なら、コンパイラの警告を見たことがあるでしょう。 たとえば、下のコードを考えます:

Filename: src/main.rs

fn do_something() {}

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

ここで、do_something関数を100回呼んでいますが、forループの内部で変数iを一度も使っていません。 Rustはこれについて警告します:

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

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

警告は、変数名に_iを使ってはどうかと提案しています:アンダーバーはその変数を使わないという意図を示すのです。 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によってコードが変更されていることがわかります。

Filename: src/main.rs

fn do_something() {}

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

forループの変数は_iという名前になったので、警告はもう現れません。

cargo fixコマンドを使うと、異なるRust editionの間でコードを変換することもできます。 editionについては付録Eに書いています。

Clippyでもっとlintを

Clippyというツールは、コードを分析することで、よくある間違いを見つけ、Rustのコードを改善させてくれるlintを集めたものです(訳注:いわゆる静的解析ツール)。

Clippyをインストールするには、次を入力してください:

$ rustup component add clippy

Clippyのlintは、次のコマンドでどんな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. Consider using it directly
 --> src/main.rs:2:13
  |
2 |     let x = 3.1415;
  |             ^^^^^^
  |
  = note: #[deny(clippy::approx_constant)] on by default
  = help: for further information visit https://rust-lang-nursery.github.io/rust-clippy/master/index.html#approx_constant

あなたは、このエラーのおかげで、Rustにはより正確に定義された定数がすでにあり、これを代わりに使うとプログラムがより正しくなるかもしれないと気づくことができます。 なので、あなたはコードを定数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についてより詳しく知るには、ドキュメントを読んでください。

Rust Language Serverを使ってIDEと統合する

IDEでの開発の助けになるよう、Rustプロジェクトは Rust Language Server (rls)を配布しています。 このツールは、Language Server Protocolという、IDEとプログラミング言語が対話するための仕様に対応しています。 Visual Studio CodeのRustプラグインをはじめ、様々なクライアントがrlsを使うことができます。

rlsをインストールするには、以下を入力してください:

$ rustup component add rls

つづけて、あなたのIDE向けのlanguage serverサポートをインストールしてください。 すると、自動補完、定義へのジャンプ、インラインのエラー表示などの機能が得られるはずです。

rlsについてより詳しく知るにはドキュメントを読んでください。