首页 / Rust 入门教程 / 常用开发工具(rustfmt / clippy)

Rust 入门教程

常用开发工具(rustfmt / clippy)

本教程共 78 篇 · 第 59 篇 · 更新于 2026-08-08 · 约 8 分钟阅读

RustRust 入门教程rustfmtclippy代码格式化静态检查cargo fmt

本节目标:认识 Rust 工具链自带的两个神器——rustfmt 统一代码格式、clippy 做静态检查揪出坏味道,学会在日常和 CI 里用好它们。

Rust 的编译器以严格著称,但光靠编译器还不够。两个官方工具能补上”风格统一”和”写出更地道的 Rust”这两块:rustfmt 管格式,clippy 管写法。它们随 Rust 工具链一起安装,开箱即用。

1-1 rustfmt:让格式不再吵架

团队协作最耗神的往往不是逻辑,而是”大括号换不换行""缩进几个空格”这种格式之争。rustfmt 一句话终结争论:它按官方风格自动把你代码排得整整齐齐,所有人提交前 fmt 一下,diff 里再也看不到纯格式的噪音。

运行格式化(针对当前包):

cargo fmt

它会按官方默认规则重写所有 .rs 文件。只想检查、不改动(常用于 CI):

cargo fmt --check

--check 不修改文件,发现不规范就报错退出。CI 里用它当门槛:格式不对就不让合并。

Note

cargo fmt 其实是 rustfmt 的封装。rustfmt 的格式规则是官方统一制定的,你基本不需要记细节——相信工具,把脑子留给真正的逻辑。

想自定义少数规则,在项目根建 rustfmt.toml

max_width = 100
edition = "2024"

比如默认行宽 100 太窄,改成你习惯的;edition 跟项目保持一致。但提醒一句:格式选项改太多会和社区主流风格脱节,新人接手会不适应。除非团队有强需求,否则用默认最省心。

1-2 clippy:比编译器更啰嗦的良师

编译器只管”能不能编过”。clippy 管”编过了但写得丑不丑、有没有坑”。它是 Rust 的官方 linter,能发现几百种常见反模式和潜在 bug,比如用 .clone() 多余、可以写成更地道的写法、可能引发性能问题等。

运行 clippy 检查当前包:

cargo clippy

它会在编译器报错之外,额外打印一堆 warning:,每条都告诉你问题在哪、怎么改。比如你写了:

let _ = vec.len() == 0;

clippy 会提示:直接用 vec.is_empty() 更清晰。这种建议能潜移默化把你训练成写”地道 Rust”的人。

Tip

初学阶段别被 clippy 的 warning 吓到。它报的不一定是错误,多是”有更好的写法”。逐条看过去,你对 Rust 惯用法(idioms)的理解会涨得飞快。

在 CI 或提交前把它当硬门槛,把所有警告当错误处理:

cargo clippy -- -D warnings

-D warnings 意思是把 warning 升级成 error(deny)。这样有任何 clippy 警告,流水线就红,逼着大家把代码写干净。注意 -- 后面是传给 clippy 驱动的参数,和之前测试那章的 -- 分界是同一套逻辑。

1-3 工具的获取与版本

rustfmt 和 clippy 都包含在 rustup 的默认组件里。用官方 rustup 安装 Rust 时,它们一般已经就位。万一你的环境里没有(比如精简安装),补装:

rustup component add rustfmt
rustup component add clippy

本教程基线为 Rust 1.97.1、2024 Edition,这两个工具在该版本下均稳定可用,无需 nightly。

Warning

如果你看到教程让你切到 nightly 才能用 clippy,那是老黄历。现代稳定版 Rust 里 clippy 和 rustfmt 都早已稳定,直接 cargo clippy / cargo fmt 即可。

1-4 日常怎么用最顺手

推荐的节奏:

  • 写代码时随性写,别纠结格式——反正 cargo fmt 一键搞定。
  • 准备提交前跑一遍 cargo clippy,清掉有价值的警告。
  • cargo fmt --checkcargo clippy -- -D warnings 接进 CI,保证合进主干的代码既整齐又干净。

编辑器(VS Code、 Zed、 Neovim 等)基本都能配置”保存时自动 rustfmt""实时 clippy 提示”,开了之后你几乎感觉不到它们的存在,收益却一直在。

1-5 常见 clippy 提示举例

几个新手常撞见的 clippy 建议,提前认识能少走弯路:

  • needless borrow:写了多余的 &,比如函数已经要引用你又借一次。
  • clone on copy:对本身实现了 Copy 的类型(如 i32)调用 .clone(),直接赋值就行,无需 clone。
  • wrong usage of to_string / format:该用 to_string 的地方写了 format!,或反过来,存在更省的开法。
  • expect used:在库代码里用 .expect("...") 直接 panic,clippy 可能建议用 ? 返回 Result 把错误交给调用者。

这些都是”能跑但不够好”的信号。逐条修,代码质量肉眼可见地提升。

Note

clippy 的警告可以局部允许(allow),比如你明知某处写法特殊、clippy 误报,可在那一行加 #[allow(clippy::某个lint名)]。但别滥用 allow——先怀疑是不是自己真写歪了。

1-6 在团队里落地这两个工具

个人用是一回事,团队用是另一回事。最稳的落地方式有两层:

本地层:把编辑器配成”保存时自动 cargo fmt、实时显示 clippy 提示”。这样你写的时候就被温柔纠正,几乎感觉不到工具存在,但代码质量一直在涨。

流程层:在 CI 里把 cargo fmt --checkcargo clippy -- -D warnings 设为硬性门槛。格式不对、有 clippy 警告,流水线就红,不允许合并。这是把”代码整洁”从”靠自觉”变成”靠机制”。

Tip

还可以加 git 的 pre-commit 钩子,提交前自动 fmt。但如果团队有人环境不一致,钩子可能在不同机器上格式化结果不同。所以最可靠的还是 CI 这道关——它以统一的环境做最终裁决。

有些团队担心 clippy 太严、老代码一开全红。这种可以渐进:先 cargo clippy 看现状,把存量警告用 #[allow(...)] 在文件级临时压制,新代码严格走 -D warnings,慢慢把老代码还清。别指望一次治理干净,一点点来。

还有个心态:clippy 报的不都是 must-fix。偶尔它误报、或你的写法有特殊理由,用 allow 局部放行并写句注释说明即可。关键是”有意识地决定忽略”,而不是”无视所有警告”。

1-7 想深入时看哪里

这两个工具本身也有丰富文档。rustfmt 的所有格式选项写在官方 rustfmt.toml 配置说明里,你嫌默认风格哪点不顺眼,几乎都能找到对应开关。clippy 则有一份完整的 lint 列表,按类别(正确性、风格、复杂度、性能、可疑代码等)组织,每条都附说明和改法。遇到看不懂的 clippy 提示,去列表里搜那个 lint 名,往往一眼就明白。

Tip

把 clippy 的警告当”免费的代码评审”。它背后是社区总结的无数踩坑经验,每条提示都是在替你规避一个潜在问题。与其把它当噪音关掉,不如逐条读、逐条学——你的 Rust 功底会涨得比想象中快。

工具永远是辅,写好代码的主语还是你。它们负责把格式和坏味道标准化,把省下的精力留给真正难的设计问题。用熟了,你会觉得它们像写代码时的呼吸一样自然。

工具讲到这就够入门了。从下一章开始,我们进入本书另一个硬骨头:智能指针。