关于 rust-skills
面向编写、审查和重构 Rust 代码的实践指南,按影响优先级整理规则,涵盖所有权、错误处理、异步、并发和性能等主题。
主要功能
- 01按优先级组织 Rust 规则
- 02涵盖所有权与借用
- 03指导错误处理和异步代码
- 04涵盖并发与 unsafe 代码
- 05提供 API 设计和性能建议
- 06涉及测试、文档与项目结构
适用场景
- 01编写新的 Rust 函数或模块
- 02审查所有权和借用问题
- 03改进异步、并发或 unsafe 实现
- 04重构并优化 Rust 项目
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ leonardomso/ rust-skills --skill rust-skills安装后在 Claude Code 中输入/rust-skills确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
AGENTS.mdCLAUDE.mdCHANGELOG.mdLICENSECONTRIBUTING.mdREADME.md.github/workflows/ci.ymlchecks/.gitignoreCargo.lockCargo.tomlREADME.mdcheck.shbaseline.txtgen.pyanalyze.pyrust-toolchain.tomlgen_index.pyvalidate.pychecks/src/lib.rsrules/anti-collect-intermediate.mdanti-clone-excessive.mdanti-index-over-iter.mdanti-expect-lazy.mdanti-format-hot-path.mdanti-empty-catch.mdanti-lock-across-await.mdanti-panic-expected.mdanti-over-abstraction.mdanti-premature-optimize.mdanti-stringly-typed.md详细介绍
Rust 最佳实践
编写高质量、符合 Rust 惯例且高度优化的 Rust 代码的综合指南。包含 26 个类别中的 265 条规则,按影响程度排序,用于指导大模型进行代码生成和重构。适用于 Rust 1.96(2024 edition)。
适用场景
在以下场景中参考这些指南:
- 编写新的 Rust 函数、结构体或模块
- 实现错误处理或异步代码
- 编写并发、并行或
unsafe代码 - 为库设计公共 API
- 检查代码中的所有权/借用问题
- 优化内存使用或减少分配
- 调优热点路径的性能
- 重构现有 Rust 代码
按优先级划分的规则类别
| 优先级 | 类别 | 影响 | 前缀 | 规则数 |
|---|---|---|---|---|
| 1 | 所有权与借用 | CRITICAL | own- | 12 |
| 2 | 错误处理 | CRITICAL | err- | 12 |
| 3 | 内存优化 | CRITICAL | mem- | 17 |
| 4 | 不安全代码 | CRITICAL | unsafe- | 7 |
| 5 | API 设计 | HIGH | api- | 17 |
| 6 | Async/Await | HIGH | async- | 18 |
| 7 | 并发 | HIGH | conc- | 4 |
| 8 | 编译器优化 | HIGH | opt- | 12 |
| 9 | 数值与算术安全 | HIGH | num- | 5 |
| 10 | 类型安全 | MEDIUM | type- | 13 |
| 11 | Trait 与泛型设计 | MEDIUM | trait- | 6 |
| 12 | 转换 | MEDIUM | conv- | 3 |
| 13 | Const 与编译期处理 | MEDIUM | const- | 4 |
| 14 | Serde | MEDIUM | serde- | 8 |
| 15 | 模式匹配 | MEDIUM | pat- | 5 |
| 16 | 宏 | MEDIUM | macro- | 8 |
| 17 | 闭包 | MEDIUM | closure- | 5 |
| 18 | 集合 | MEDIUM | coll- | 4 |
| 19 | 命名约定 | MEDIUM | name- | 16 |
| 20 | 测试 | MEDIUM | test- | 15 |
| 21 | 文档 | MEDIUM | doc- | 12 |
| 22 | 可观测性 | MEDIUM | obs- | 7 |
| 23 | 性能模式 | MEDIUM | perf- | 13 |
| 24 | 项目结构 | LOW | proj- | 14 |
| 25 | Clippy 与 Lint | LOW | lint- | 13 |
| 26 | 反模式 | REFERENCE | anti- | 15 |
快速参考
1. 所有权与借用(CRITICAL)
own-borrow-over-clone- 优先借用&T,而不是使用.clone()own-slice-over-vec- 接受&[T]而不是&Vec<T>,接受&str而不是&Stringown-cow-conditional- 条件性所有权使用Cow<'a, T>own-arc-shared- 线程安全的共享所有权使用Arc<T>own-rc-single-thread- 单线程环境中的共享所有权使用Rc<T>own-refcell-interior- 单线程代码中的内部可变性使用RefCell<T>own-mutex-interior- 跨线程的内部可变性使用Mutex<T>own-rwlock-readers- 读取次数远多于写入次数时使用RwLock<T>own-copy-small- 为小型简单类型实现Copyown-clone-explicit- 对复制成本有实际意义的类型显式使用Cloneown-move-large- 移动大型类型,而不是复制;移动成本高时使用Boxown-lifetime-elision- 遵循生命周期省略规则;仅在必要时添加显式生命周期
2. 错误处理(关键)
err-thiserror-lib- 使用thiserror定义库的错误类型err-anyhow-app- 使用anyhow处理应用程序错误err-result-over-panic- 对可恢复的错误返回Result<T, E>,而不是触发 panicerr-context-chain- 使用.context()或.with_context()添加上下文err-no-unwrap-prod- 避免在生产代码中使用unwrap();使用?、expect()或处理错误err-expect-bugs-only- 仅对表明存在 Bug 的不变量使用expect(),不要用于用户错误err-question-mark- 使用?运算符简洁地传播错误err-from-impl- 为错误转换实现From<E>,以便使用?运算符err-source-chain- 使用#[source]或source()方法保留错误链err-lowercase-msg- 错误消息以小写字母开头,末尾不加标点err-doc-errors- 在文档注释的# Errors部分说明错误条件err-custom-type- 为特定领域的失败定义自定义错误类型
3. 内存优化(关键)
mem-with-capacity- 大小已知时使用with_capacity()mem-smallvec- 对通常较小的集合使用SmallVecmem-arrayvec- 对永不在堆上分配的固定容量集合使用ArrayVec<T, N>mem-box-large-variant- 对较大的枚举变体使用 Box,以减小枚举的整体大小mem-boxed-slice- 对固定大小的堆数据使用Box<[T]>,而不是Vec<T>mem-thinvec- 对开销最小的可空集合使用ThinVec<T>mem-clone-from- 反复克隆时使用clone_from()重用分配mem-reuse-collections- 在循环中清空并重用集合,而不是创建新集合mem-avoid-format- 可以使用字符串字面量时,避免使用format!()mem-write-over-format- 使用write!()写入现有缓冲区,而不是通过format!()分配内存mem-arena-allocator- 对批量分配使用 arena 分配器mem-zero-copy- 使用切片和Bytes实现零拷贝模式mem-compact-string- 对内存受限的字符串存储使用紧凑字符串类型mem-smaller-integers- 使用大小合适的整数以减少内存占用mem-assert-type-size- 使用静态断言,防止类型大小意外增长mem-take-replace- 使用mem::take/mem::replace从&mut中移出值,而不进行克隆mem-drop-order- 了解并控制析构顺序:结构体字段从上到下析构,局部变量按相反顺序析构
4. 不安全代码(严重)
unsafe-safety-comment- 在每个unsafe代码块上方编写// SAFETY:注释,并在每个unsafe fn中添加# Safety章节。unsafe-minimize-scope- 尽可能缩小unsafe代码块的范围——只标记需要不安全操作的部分,不要包含周围的安全代码。unsafe-miri-ci- 对每个包含unsafe代码的 crate,在 CI 中运行cargo miri test。unsafe-maybeuninit- 使用MaybeUninit<T>处理未初始化内存;对于具有有效性约束的类型,绝不要使用mem::uninitialized()或mem::zeroed()。unsafe-extern-block- 在 Rust 2024 中,将extern代码块写为unsafe extern { },并将每个条目标注为safe或unsafe。unsafe-send-sync-manual- 手动实现Send或Sync时,记录相关不变式;优先让编译器自动推导。unsafe-no-mangle-unsafe- 在 Rust 2024 中,使用#[unsafe(no_mangle)]、#[unsafe(export_name = "...")]和#[unsafe(link_section = "...")],而非不带包装的属性形式。
5. API 设计(高)
api-builder-pattern- 对复杂构造使用 Builder 模式api-builder-must-use- 为构建器方法标注#[must_use],防止结果被悄然丢弃api-newtype-safety- 使用新类型,避免混淆语义不同的值api-typestate- 使用 typestate 模式,在类型系统中编码状态机不变式api-sealed-trait- 使用密封 trait,在允许使用的同时阻止外部实现api-extension-trait- 使用扩展 trait 为外部类型添加方法api-parse-dont-validate- 在边界处解析为经过验证的类型api-impl-into- 接受impl Into<T>以提供灵活的 API,并为转换实现From<T>api-impl-asref- 只需借用内部数据时使用AsRef<T>api-must-use- 忽略结果可能导致错误时,为类型和函数标注#[must_use]api-non-exhaustive- 为公共枚举和结构体使用#[non_exhaustive],以保持向前兼容api-from-not-into- 实现From<T>,而非Into<U>——使用From可自动获得Intoapi-default-impl- 为具有合理默认值的类型实现Defaultapi-common-traits- 为公共类型实现标准 trait(Debug、Clone、PartialEq 等)api-serde-optional- 将 serde 设为功能标志,而非库 crate 的硬依赖api-impl-fromiterator- 为集合类型实现FromIterator和Extend,并为三种引用形式实现IntoIteratorapi-operator-overload- 仅当语义自然且不会令人意外时才重载运算符
6. 异步/等待(HIGH)
async-tokio-runtime- 根据工作负载适当配置 Tokio 运行时async-no-lock-await- 绝不要在.await期间持有Mutex/RwLockasync-spawn-blocking- 对 CPU 密集型工作使用spawn_blockingasync-tokio-fs- 在异步代码中使用tokio::fs,而非std::fsasync-cancellation-token- 使用CancellationToken实现平滑关闭和任务取消async-join-parallel- 对并发的独立 Future 使用join!或try_join!async-try-join- 对并发的可失败操作使用try_join!,遇到错误时提前返回async-select-racing- 使用select!竞争多个 Future,并处理最先完成的那个async-bounded-channel- 使用有界通道施加背压,避免内存无限增长async-mpsc-queue- 使用mpsc通道在任务间创建异步消息队列async-broadcast-pubsub- 在所有订阅者都应接收所有消息时,使用broadcast通道实现发布/订阅async-watch-latest- 使用watch通道与多个观察者共享最新值async-oneshot-response- 对请求-响应模式使用oneshot通道async-joinset-structured- 使用JoinSet管理动态的已生成任务集合async-clone-before-await- 在 await 点之前克隆 Arc/Rc 数据,避免在挂起期间持有引用async-fn-in-trait- 在 trait 中使用原生async fn(稳定版 1.75),而非async_trait宏async-async-fn-bounds- 使用AsyncFn/AsyncFnMut/AsyncFnOnce约束,而非F: Fn() -> Fut, Fut: Futureasync-cancel-safety- 确保tokio::select!分支中使用的 Future 支持取消安全
7. 并发(HIGH)
conc-rayon-par-iter- 对 CPU 密集型数据并行处理使用 rayon 的par_iter()conc-scoped-threads- 使用std::thread::scope在线程间借用栈数据conc-atomic-ordering- 对每个原子操作使用正确且最弱的内存Orderingconc-thread-local- 优先使用搭配Cell/RefCell的thread_local!,而非static mut
8. 编译器优化(高)
opt-inline-small- 对小型热点函数使用#[inline]opt-inline-always-rare- 谨慎使用#[inline(always)]——仅用于经性能分析证实的关键热点路径opt-inline-never-cold- 对错误路径和极少执行的代码使用#[inline(never)]和#[cold]opt-cold-unlikely- 使用#[cold]标记不太可能执行的代码路径,以帮助编译器优化opt-likely-hint- 使用代码结构提示可能执行的分支;在 nightly 上使用内建函数opt-lto-release- 在发布构建中启用 LTOopt-codegen-units- 将codegen-units = 1设置为在发布构建中实现最大优化opt-pgo-profile- 使用基于性能分析的优化(PGO)来实现最高性能opt-target-cpu- 在已知的部署目标上使用target-cpu=native以实现最高性能opt-bounds-check- 在热点路径中使用可消除边界检查的迭代器和模式opt-simd-portable- 使用可移植 SIMD 在不同架构上执行向量化操作opt-cache-friendly- 组织数据,以实现缓存友好的访问模式
9. 数值与算术安全性(高)
num-overflow-explicit- 显式处理整数溢出:checked_/saturating_/wrapping_/overflowing_num-cast-try-from- 避免在窄化转换中使用as;扩大转换使用From,窄化转换使用TryFromnum-float-compare- 不要使用==比较浮点数;使用容差,并在排序时使用total_cmpnum-saturating-clamp- 使用clamp和饱和算术限制数值范围num-nonzero- 使用NonZero*类型禁止零值,并启用利基优化
10. 类型安全(中)
type-newtype-ids- 使用新类型封装 ID:UserId(u64)type-newtype-validated- 使用新类型在构造时强制执行验证type-enum-states- 使用枚举表示互斥状态type-option-nullable- 对可能不存在的值使用Option<T>type-result-fallible- 对可能失败的操作使用Result<T, E>type-phantom-marker- 使用PhantomData表达类型关系,且不产生运行时开销type-never-diverge- 对永不返回的函数使用!(never 类型)type-generic-bounds- 仅在需要时添加 trait 约束;为提高可读性,优先使用 where 子句type-no-stringly- 避免使用字符串类型的 API;改用枚举、新类型或经过验证的类型type-repr-transparent- 在 FFI 场景中为新类型使用#[repr(transparent)]type-deref-coercion- 仅为智能指针类型和透明包装类型实现Deref/DerefMuttype-display-vs-debug- 面向用户的输出使用Display,诊断信息使用Debug;切勿混用type-numeric-fmt- 为数值新类型实现LowerHex、UpperHex、Octal和Binary
11. Trait 与泛型设计(中等)
trait-associated-type-vs-generic- 当每个实现恰好有一个输出类型时,使用关联类型;当某个类型可以针对多种输入类型实现该 trait 时,使用泛型参数trait-blanket-impl- 使用 blanket implimpl<T: Bound> Trait for T,为所有满足约束的类型提供行为trait-coherence-newtype- 遵守孤儿规则;将外部类型包装为 newtype,以便为其实现外部 traittrait-default-methods- 通过少数必需方法及基于这些方法的默认方法来定义 traittrait-dyn-vs-generic- 有意识地选择静态分发(泛型 /impl Trait)还是动态分发(dyn Trait)trait-object-safety- 需要使用dyn Trait时,确保 trait 与 dyn 兼容(对象安全)
12. 类型转换(中等)
conv-tryfrom-fallible- 对可能失败的类型转换实现TryFrom,而不是使用临时的转换函数conv-fromstr-parsing- 实现FromStr,以便对字符串到类型的转换使用str::parseconv-asmut-mutable- 使用impl AsMut<T>接受灵活的可变借用输入,而不是具体的可变引用
13. 常量与编译时计算(中等)
const-block- 使用内联const { }块进行编译时求值和断言const-fn- 函数可在编译时运行时,将其声明为const fnconst-generics- 使用 const 泛型<const N: usize>,按值进行参数化const-vs-static- 内联值使用const,单个具有固定地址的实例使用static
14. Serde(中等)
serde-rename-all- 使用#[serde(rename_all = ...)]匹配外部命名约定serde-default-compat- 对可选且向后兼容的字段使用#[serde(default)]serde-skip-empty- 使用skip_serializing_if忽略空字段serde-flatten- 使用#[serde(flatten)]内联嵌套结构体或捕获额外键serde-enum-representation- 有意识地选择枚举标记方式:外部标记、内部标记、相邻标记或无标记serde-deny-unknown-fields- 使用#[serde(deny_unknown_fields)]拒绝意外的键serde-custom-with- 使用with/serialize_with/deserialize_with自定义字段的序列化与反序列化serde-try-from-validate- 使用#[serde(try_from = "Raw")]在反序列化时进行验证
15. 模式匹配(中等)
pat-let-else- 使用let ... else提前返回并提取模式匹配结果pat-matches-macro- 使用matches!()进行布尔模式测试pat-if-let-chains- 使用if let链组合模式绑定与条件pat-exhaustive-enum- 穷尽匹配所有权枚举;避免使用会隐藏新增变体的兜底_pat-at-bindings- 使用@绑定,在将值与模式匹配的同时捕获该值
16. 宏(中)
macro-prefer-functions- 只有函数或泛型无法表达需求时,才使用宏macro-rules-hygiene- 依赖macro_rules!的卫生机制,并使用$crate引用 crate 中的条目macro-fragment-specifiers- 尽可能使用精确的片段说明符进行捕获,而不是原始的:ttmacro-export-crate-path- 使用#[macro_export]导出声明式宏,并提供清晰的导入路径macro-private-helpers- 将宏生成的辅助条目隐藏在#[doc(hidden)] pub mod __private后macro-proc-two-crate- 将过程宏放入专用的proc-macro = truecrate,并从 facade 重新导出macro-proc-syn-quote- 使用syn、quote和proc-macro2构建过程宏macro-proc-error-spans- 将过程宏错误报告为带有跨度的编译错误,切勿通过 panic 报错
17. 闭包(中)
closure-fn-trait-bounds- 回调只需满足其所需的最宽松Fntrait(FnOnce⊇FnMut⊇Fn)closure-impl-fn-return- 将闭包作为impl Fn/FnMut/FnOnce返回,而不是Box<dyn Fn>closure-move-capture- 对生命周期超出当前作用域的闭包使用move;在move前克隆,以保留原值closure-static-vs-dyn- 热路径回调接受泛型impl Fn;若要减少代码体积或存储回调,则使用&dyn Fn/Box<dyn Fn>closure-disjoint-capture- 只捕获实际使用的内容;充分利用 edition-2021 的闭包不相交捕获
18. 集合(中)
coll-binaryheap- 对于优先队列或反复提取最大值,使用BinaryHeapcoll-map-choice- 根据访问模式选择映射:HashMap(速度快、无序)、BTreeMap(有序/范围查询)、IndexMap(按插入顺序)coll-seq-choice- 默认使用Vec;队列/双端队列行为使用VecDeque;避免使用LinkedListcoll-set-membership- 使用HashSet/BTreeSet进行成员测试和去重,而不是线性遍历Vec::contains
19. 命名约定(中)
name-types-camel- 类型、特征和枚举名称使用UpperCamelCasename-variants-camel- 枚举变体使用UpperCamelCasename-funcs-snake- 函数、方法、变量和模块使用snake_casename-consts-screaming- 常量和静态变量使用SCREAMING_SNAKE_CASEname-lifetime-short- 使用简短且惯用的生命周期名称:'a、'b、'de、'srcname-type-param-single- 类型参数使用单个大写字母:T、E、K、Vname-as-free-as_前缀:转换为自由引用name-to-expensive- 对需要分配或计算的开销较大的转换使用to_前缀name-into-ownership- 对会消耗所有权的转换使用into_前缀name-no-get-prefix- 简单的获取器省略 get_ 前缀name-is-has-bool- 返回布尔值的方法使用is_、has_、can_、should_前缀name-iter-convention- 迭代器方法使用 iter/iter_mut/into_itername-iter-method- 迭代器方法统一命名为iter()、iter_mut()和into_iter()name-iter-type-match- 迭代器类型的名称应与其源方法对应name-acronym-word- 标识符中的缩写按单词处理:使用HttpServer,而非HTTPServername-crate-no-rs- crate 名称不要添加-rs或-rust后缀
20. 测试(中)
test-cfg-test-module- 在每个模块中使用#[cfg(test)] mod tests { }编写单元测试test-use-super- 在测试模块中使用use super::*;访问父模块中的项目test-integration-dir- 将集成测试放在tests/目录中test-descriptive-names- 使用能说明测试内容的描述性测试名称test-arrange-act-assert- 将测试清晰地划分为 Arrange、Act、Assert 部分test-proptest-properties- 使用 proptest 进行基于属性的测试test-mockall-mocking- 使用 mockall 模拟特征test-mock-traits- 依赖项使用特征,以便在测试中进行模拟test-fixture-raii- 使用 RAII 模式(Drop 特征)自动清理测试test-tokio-async- 使用#[tokio::test]编写异步测试test-should-panic- 使用#[should_panic]测试代码是否按预期发生 panictest-criterion-bench- 使用criterion进行基准测试test-doctest-examples- 将文档示例保留为可执行的文档测试test-loom-concurrency- 使用loom穷举测试无锁和并发代码test-snapshot-testing- 对复杂或序列化输出使用快照测试(insta)
21. 文档(MEDIUM)
doc-all-public- 使用///文档注释为所有公开项编写文档doc-module-inner- 使用//!编写模块级文档doc-examples-section- 添加包含可运行代码的# Examplesdoc-errors-section- 为可能失败的函数添加# Errors部分doc-panics-section- 为可能 panic 的函数添加# Panics部分doc-safety-section- 为不安全函数添加# Safety部分doc-question-mark- 在示例中使用?,而非.unwrap()doc-hidden-setup- 使用#前缀隐藏示例中的准备代码doc-intra-links- 使用文档内链接引用类型和项doc-link-types- 使用文档内链接关联相关类型和函数doc-cargo-metadata- 为已发布的 crate 填写Cargo.toml元数据doc-crate-readme- 使用#![doc = include_str!("../README.md")]统一 README 与 crate 根文档
22. 可观测性(MEDIUM)
obs-tracing-over-log- 使用tracing进行结构化、带跨度上下文的诊断,而非println!或裸logobs-library-facade- 库通过 tracing/log 门面输出日志,绝不安装订阅器obs-structured-fields- 记录结构化的键值字段,而非将值插入消息字符串obs-instrument-spans- 使用#[tracing::instrument]和跨度为异步任务与请求附加上下文obs-levels-filter- 合理使用日志级别,并通过EnvFilter/RUST_LOG进行过滤obs-error-chain- 记录错误的完整来源链,并确保每个错误只记录一次obs-no-sensitive-data- 绝不记录机密或个人身份信息(PII);对其进行脱敏或跳过
23. 性能模式(MEDIUM)
perf-iter-over-index- 优先使用迭代器,而非手动索引perf-iter-lazy- 保持迭代器惰性,仅在需要时收集perf-collect-once- 不要收集临时迭代器perf-entry-api- 使用 map 的 entry API 执行插入或更新perf-drain-reuse- 使用 drain 重用分配perf-extend-batch- 批量插入时使用 extendperf-chain-avoid- 避免在热点循环中使用 chainperf-collect-into- 使用 collect_into 重用容器perf-black-box-bench- 在基准测试中使用 black_boxperf-release-profile- 优化发布配置perf-profile-first- 优化前先进行性能分析perf-ahash- 无需防范 DoS 时,使用更快的哈希器(ahash/FxHashMap)perf-io-buffering- 对许多小型操作使用BufReader/BufWriter包装Read/Write
24. 项目结构(LOW)
proj-lib-main-split- 保持main.rs简洁,将逻辑放在lib.rs中proj-mod-by-feature- 按功能而非类型组织模块proj-flat-small- 小型项目保持扁平结构proj-mod-rs-dir- 多文件模块使用 mod.rsproj-pub-crate-internal- 内部 API 使用 pub(crate)proj-pub-super-parent- 仅允许父级访问时使用 pub(super)proj-pub-use-reexport- 使用 pub use 提供简洁的公共 APIproj-prelude-module- 创建 prelude 模块,以便导入常用内容proj-bin-dir- 将多个二进制文件放在 src/bin/ 中proj-workspace-large- 大型项目使用工作区proj-workspace-deps- 使用工作区依赖继承,确保各 crate 版本一致proj-feature-additive- 将 Cargo 功能设计为严格的增量式功能proj-msrv-declare- 在 Cargo.toml 中声明rust-version(MSRV),并在 CI 中测试proj-build-rs-minimal- 保持build.rs简洁、确定且幂等
25. Clippy 与 Lint(LOW)
lint-deny-correctness-#![deny(clippy::correctness)]lint-warn-suspicious- 启用 clippy::suspicious,以发现可能的错误lint-warn-style- 启用 clippy::style,以编写符合惯用风格的代码lint-warn-complexity- 启用 clippy::complexity,以简化代码lint-warn-perf- 启用 clippy::perf,以改进性能lint-pedantic-selective- 有选择地启用 clippy::pedanticlint-missing-docs- 对缺少文档的公共项发出警告lint-unsafe-doc- 要求为 unsafe 代码块编写文档lint-cargo-metadata- 为已发布的 crate 启用 clippy::cargolint-rustfmt-check- 在 CI 中运行 cargo fmt --checklint-workspace-lints- 在工作区级别配置 lint,以确保统一执行lint-cfg-check- 启用unexpected_cfgs并声明已知 cfg,以发现功能门拼写错误lint-clippy-nursery-selected- 有选择地启用高价值的clippy::nurserylint,而非启用整个 lint 组
26. 反模式(参考)
anti-unwrap-abuse- 不要在生产代码中使用.unwrap()anti-expect-lazy- 对可恢复的错误不要使用 expectanti-clone-excessive- 可以借用时不要克隆anti-lock-across-await- 不要在 await 点之间持有锁anti-string-for-str- 可以使用 &str 时不要接受 &Stringanti-vec-for-slice- 可以使用 &[T] 时不要接受 &Vecanti-index-over-iter- 可以使用迭代器时不要使用索引anti-panic-expected- 对预期发生或可恢复的错误不要触发 panicanti-empty-catch- 不要默默忽略错误anti-over-abstraction- 不要使用过多泛型进行过度抽象anti-premature-optimize- 未进行性能分析前不要优化anti-type-erasure- 可以使用 impl Trait 时不要使用 Boxanti-format-hot-path- 不要在热点路径中使用 format!anti-collect-intermediate- 不要收集中间迭代器anti-stringly-typed- 枚举或新类型可以提供类型安全时,不要使用字符串
推荐的 Cargo.toml 设置
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
panic = "abort"
strip = true
[profile.bench]
inherits = "release"
debug = true
strip = false
[profile.dev]
opt-level = 0
debug = true
[profile.dev.package."*"]
opt-level = 3 # Optimize dependencies in dev
使用方法
此技能提供规则标识符,便于快速参考。生成或审查 Rust 代码时:
- 检查相关类别,根据任务类型选择
- 应用规则,使用匹配的前缀
- 确定优先级:CRITICAL > HIGH > MEDIUM > LOW
- 阅读规则文件,在
rules/中查看详细示例
按任务应用规则
| 任务 | 主要类别 |
|---|---|
| 新函数 | own-、err-、name-、pat- |
| 新结构体/API | api-、type-、conv-、doc- |
| 异步代码 | async-、own- |
| 并发/并行 | conc-、async-、own- |
| 不安全代码 | unsafe-、type-、test- |
| 错误处理 | err-、api-、pat- |
| 类型转换 | conv-、api- |
| 序列化(serde) | serde-、type-、api- |
| 数值/算术 | num-、type- |
| 宏/代码生成 | macro-、anti- |
| 闭包/回调 | closure-、type- |
| 日志记录/可观测性 | obs-、err- |
| 内存优化 | mem-、own-、perf- |
| 性能调优 | opt-、mem-、perf- |
| 代码审查 | anti-、lint- |
来源与致谢
此技能综合了官方 Rust 指南、知名书籍和广泛使用的 crate 中的实践经验。它与 Rust 项目或任何 crate 作者均无关联,也未获其认可;文中内容和代码示例均为原创。
官方 Rust 文档
书籍与指南
- Rust 性能手册 — Nicholas Nethercote
- Rust 设计模式 — rust-unofficial
- Rust 原子操作与锁 — Mara Bos
- Effective Rust — David Drysdale
工具
用于研究惯用写法的真实代码库
- ripgrep、tokio、serde、clap、polars、axum、cargo、hyper、bevy、rayon,以及 dtolnay 的 crate(thiserror、anyhow、syn)
本项目采用 MIT 许可证。引用的上游材料仍受各自许可证约束(官方 Rust 文档和 API 指南采用 MIT / Apache-2.0 双重许可)。
评论
支持 Markdown