其他
用 Rust 编写/审查/调试内存安全且零成本抽象的惯用代码…
在构建 Rust 应用、解决所有权与借用问题、设计基于 trait 的 API、用 tokio 实现 async/await 并发、编写 FFI 绑定或做性能与内存安全优化时,按此流程与规范落地。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 54/100 ×0.15
适用场景
用 Rust 编写/审查/调试内存安全且通用
解决思路
- 分析所有权:设计生命周期关系与借用模式;当类型推导不足以表达时,显式标注生命周期。
- 设计 trait:使用泛型和关联类型构建 trait 层级。
- 安全实现:编写惯用 Rust,把 unsafe 代码降到最少;每个 unsafe 块都要用注释写明其安全不变量。
- 处理错误:使用 Result/Option 配合 ? 运算符,并通过 thiserror 定义自定义错误类型。
- 验证:运行 cargo clippy --all-targets --all-features、cargo fmt --check 和 cargo test,在最终交付前修复所有警告。
- 按上下文加载参考文档:所有权问题读 references/ownership.md(生命周期、借用、智能指针、Pin);trait 设计读 references/traits.md(trait 设计、泛型、关联类型、derive);错误处理读 references/error-handling.md(Result、Option、?、自定义错误、thiserror);异步读 references/async.md(async/await、tokio、futures、streams、并发);测试读 references/testing.md(单元/集成测试、proptest、基准测试)。
- 所有权与生命周期:用显式生命周期标注表达借用关系(如 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str);优先借用而不是克隆,参数用 &[u8] 而非 Vec<u8>。
- Trait 设计:定义 trait 并给方法提供默认实现(如 preview 默认调用 summarise 并截断),再用 impl Summary for Article 为具体类型实现必需方法。
- 错误处理:用 #[derive(Debug, Error)] 定义错误枚举,每个变体用 #[error("...")] 描述信息,用 #[from] 做错误自动转换,并在函数中通过 ? 传播错误。
- 异步实现:用 #[tokio::main] 标注入口、把 IO 写成 async fn 并 .await;用 tokio::join! 并发跑多个任务;绝不在 async 上下文里混入阻塞调用。
- 执行验证命令:cargo fmt --check 做风格检查、cargo clippy --all-targets --all-features 做 lint、cargo test 跑单元与集成测试、cargo test --doc 跑 doctest、cargo bench 跑 criterion 基准测试(若存在)。
- 必须做到:用所有权与借用保证内存安全;最小化 unsafe 并为每个 unsafe 块写明安全不变量;用类型系统获得编译期保证;显式处理所有错误(Result/Option);为代码补充带示例的完整文档;运行 cargo clippy 并修复所有警告;用 cargo fmt 保持格式一致;编写测试并包含 doctest。
- 绝不能做:生产代码里用 unwrap()(改用带消息的 expect());制造内存泄漏或悬垂指针;写没有文档说明安全不变量的 unsafe;忽略 clippy 警告;错误地混用阻塞与异步代码;跳过错误处理;在 &str 够用时用 String;不必要的 clone(改用借用)。
- 输出实现时按模板交付:1) 类型定义(struct、enum、trait);2) 所有权正确的实现;3) 使用自定义错误类型的错误处理;4) 测试(单元、集成、doctest);5) 简要说明设计决策。
适用边界 · 注意事项
- 非 Rust 项目,或不需要系统级性能与内存安全保证的场景。
- 无法引入 tokio、thiserror、serde 等第三方 crate 的受限环境,需另行取舍依赖。
- 一次性脚本或原型中,强制 clippy 全绿、完整文档与 doctest 的投入产出比不高。