Clippy 与代码规范
问题
如何保证 Rust 代码质量?
答案
Clippy:Rust 的 ESLint
# 运行 Clippy
cargo clippy
cargo clippy -- -D warnings # 把 warning 当 error(推荐 CI 使用)
cargo clippy --fix # 自动修复
常见的 Clippy 建议:
// ❌ Clippy 警告:使用 .cloned() 代替 .map(|x| x.clone())
let v: Vec<String> = vec!["a".into()];
let _: Vec<String> = v.iter().map(|x| x.clone()).collect();
// ✅ 修复
let _: Vec<String> = v.iter().cloned().collect();
// ❌ 多余的 if let
if let Some(x) = option {
x
} else {
return;
};
// ✅ 用 let-else
let Some(x) = option else { return; };
rustfmt:代码格式化
rustfmt.toml
edition = "2021"
max_width = 100
tab_spaces = 4
use_small_heuristics = "Max"
imports_granularity = "Crate"
group_imports = "StdExternalCrate"
cargo fmt # 格式化所有代码
cargo fmt -- --check # 检查格式(不修改)
项目级 Lint 配置
src/lib.rs
// 项目级别的 lint 配置
#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![allow(clippy::module_name_repetitions)]
#![deny(unsafe_code)] // 禁止 unsafe
常见面试问题
Q1: Clippy 的 lint 级别有哪些?
答案:
| 级别 | 说明 | 启用方式 |
|---|---|---|
clippy::all | 默认开启的 lint | 默认 |
clippy::pedantic | 更严格的建议 | 手动启用 |
clippy::nursery | 实验性 lint | 手动启用 |
clippy::restriction | 限制性规则 | 按需启用 |
推荐开启 clippy::all + clippy::pedantic,按需 #[allow] 部分过严的规则。