常用开发工具(rustfmt / clippy)
本教程共 78 篇 · 第 59 篇 · 更新于 2026-08-08 · 约 8 分钟阅读
本节目标:认识 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 --check和cargo 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把错误交给调用者。
这些都是”能跑但不够好”的信号。逐条修,代码质量肉眼可见地提升。
Noteclippy 的警告可以局部允许(allow),比如你明知某处写法特殊、clippy 误报,可在那一行加
#[allow(clippy::某个lint名)]。但别滥用 allow——先怀疑是不是自己真写歪了。
1-6 在团队里落地这两个工具
个人用是一回事,团队用是另一回事。最稳的落地方式有两层:
本地层:把编辑器配成”保存时自动 cargo fmt、实时显示 clippy 提示”。这样你写的时候就被温柔纠正,几乎感觉不到工具存在,但代码质量一直在涨。
流程层:在 CI 里把 cargo fmt --check 和 cargo 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 功底会涨得比想象中快。
工具永远是辅,写好代码的主语还是你。它们负责把格式和坏味道标准化,把省下的精力留给真正难的设计问题。用熟了,你会觉得它们像写代码时的呼吸一样自然。
工具讲到这就够入门了。从下一章开始,我们进入本书另一个硬骨头:智能指针。