SKILL.md
readonly只读
name
rust-best-practices
description
基于 Apollo GraphQL 最佳实践手册编写地道 Rust 代码的指南。在以下场景使用此技能: (1) 编写新的 Rust 代码或函数, (2) 审查或重构现有 Rust 代码, (3) 在借用与克隆或所有权模式之间做决策, (4) 使用 Result 类型实现错误处理, (5) 优化 Rust 代码性能, (6) 为 Rust 项目编写测试或文档。
Rust 最佳实践
在编写或审查 Rust 代码时应用这些指南。基于 Apollo GraphQL 的 Rust 最佳实践手册。
最佳实践参考
在审查之前,熟悉 Apollo 的 Rust 最佳实践。在同一轮中并行阅读所有相关章节。在提供反馈时参考这些文件:
- 第 1 章 - 编码风格与惯用法:借用与克隆、Copy trait、Option/Result 处理、迭代器、注释
- 第 2 章 - Clippy 与 Linting:Clippy 配置、重要 lint、工作区 lint 设置
- 第 3 章 - 性能思维:性能分析、避免冗余克隆、栈与堆、零成本抽象
- 第 4 章 - 错误处理:Result 与 panic、thiserror 与 anyhow、错误层次结构
- 第 5 章 - 自动化测试:测试命名、每个测试一个断言、快照测试
- 第 6 章 - 泛型与分发:静态分发与动态分发、trait 对象
- 第 7 章 - 类型状态模式:编译时状态安全、何时使用
- 第 8 章 - 注释与文档:何时注释、文档注释、rustdoc
- 第 9 章 - 理解指针:线程安全、Send/Sync、指针类型
快速参考
借用与所有权
- 优先使用
&T而非.clone(),除非需要所有权转移 - 在函数参数中使用
&str而非String,&[T]而非Vec<T> - 小的
Copy类型(≤24 字节)可以按值传递 - 当所有权不明确时使用
Cow<'_, T>
错误处理
- 对可能失败的操作返回
Result<T, E>;在生产环境中避免panic! - 绝不在测试之外使用
unwrap()/expect() - 库错误使用
thiserror,仅二进制文件使用anyhow - 优先使用
?运算符而非 match 链进行错误传播
性能
- 始终使用
--release标志进行基准测试 - 运行
cargo clippy -- -D clippy::perf获取性能提示 - 避免在循环中克隆;对于 Copy 类型使用
.iter()而非.into_iter() - 优先使用迭代器而非手动循环;避免中间
.collect()调用
Linting
定期运行:cargo clippy --all-targets --all-features --locked -- -D warnings
需要关注的关键 lint:
redundant_clone- 不必要的克隆large_enum_variant- 过大的变体(考虑装箱)needless_collect- 过早的收集
使用 #[expect(clippy::lint)] 而非 #[allow(...)],并附上理由注释。
测试
- 描述性地命名测试:
process_should_return_error_when_input_empty() - 尽可能每个测试一个断言
- 对公共 API 示例使用文档测试(
///) - 考虑使用
cargo insta对生成的输出进行快照测试
泛型与分发
- 对性能关键的代码优先使用泛型(静态分发)
- 仅在需要异构集合时使用
dyn Trait - 在 API 边界处装箱,而非内部
类型状态模式
在类型系统中编码有效状态,以便在编译时捕获无效操作:
struct Connection<State> { /* ... */ _state: PhantomData<State> }
struct Disconnected;
struct Connected;
impl Connection<Connected> {
fn send(&self, data: &[u8]) { /* 只有已连接才能发送 */ }
}
文档
//注释解释为什么(安全性、变通方法、设计理由)///文档注释解释公共 API 的是什么和如何做- 每个
TODO需要关联一个问题:// TODO(#42): ... - 为库启用
#![deny(missing_docs)]






