附录 D - 有用的开发工具

在本附录中,我们讨论了 Rust 项目提供的一些有用的开发工具。我们将介绍自动格式化、快速应用警告修复、代码检查器以及与 IDE 的集成。

使用 rustfmt 自动格式化

rustfmt 工具根据社区代码风格重新格式化您的代码。许多协作项目使用 rustfmt 来防止关于编写 Rust 时使用哪种风格的争论:每个人都使用该工具格式化他们的代码。

要安装rustfmt,请输入以下内容:

$ rustup component add rustfmt

这个命令给你 rustfmtcargo-fmt,类似于 Rust 给你 rustccargo 的方式。要格式化任何 Cargo 项目,请输入以下内容:

$ cargo fmt

运行此命令将重新格式化当前包中的所有 Rust 代码。这只会更改代码风格,而不会更改代码语义。有关 rustfmt 的更多信息,请参阅 其文档

使用 rustfix 修复您的代码

rustfix 工具随 Rust 安装包一起提供,可以自动修复有明确修正方法的编译器警告,这些修正方法很可能是你想要的。你可能之前见过编译器警告。例如,考虑以下代码:

文件名: 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 0..100 {
  |         ^ help: consider using `_i` instead
  |
  = note: #[warn(unused_variables)] on by default

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

警告建议我们使用 _i 作为名称:下划线表示我们打算不使用此变量。我们可以使用 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 do_something() {}

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

for 循环变量现在命名为 _i,警告不再出现。

您还可以使用 cargo fix 命令在不同的 Rust 版本之间转换您的代码。版本在 附录 E 中介绍。

更多 Clippy 检查

Clippy 工具是一组用于分析您的代码的 lint,以便您可以捕捉常见错误并改进您的 Rust 代码。

要安装 Clippy,请输入以下内容:

$ rustup component add clippy

要在任何 Cargo 项目上运行 Clippy 的 lint,请输入以下内容:

$ cargo clippy

例如,假设你编写了一个程序,该程序使用了数学常数(如π)的近似值,就像这个程序一样:fn main() {
let pi = 3.14;
println!("The value of pi is: {}", pi);
}

文件名: 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 的更多信息,请参见 其文档

使用 rust-analyzer 进行 IDE 集成

为了帮助集成开发环境(IDE),Rust 社区推荐使用 rust-analyzer。这个工具是一组 以编译器为中心的实用程序,它使用语言服务器协议,这是一种 IDE 和编程语言之间通信的规范。不同的客户端可以使用rust-analyzer,例如 Visual Studio Code 的 Rust 分析器插件

访问 rust-analyzer 项目的 主页 获取安装说明,然后在您特定的 IDE 中安装语言服务器支持。您的 IDE 将获得诸如自动完成、跳转到定义和内联错误等功能。