跳到主要内容

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] 部分过严的规则。

相关链接