Rust 所有权排错手册
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @kunlungrowth/rust-ownership。
技能介绍
你遇到的不是语法错误,是所有权冲突
写 Rust 最常见的体验是:代码看起来没问题,编译器却报 E0505、E0597 或 E0499。这类错误的根源往往不是不会写代码,而是引用的生命周期和所有权发生了重叠。比如在循环里遍历 HashMap 的 keys() 时还想调用 insert()——前者借用了不可变引用,后者需要可变引用,Rust 直接拒绝。
这类问题靠死记语法解决不了,需要一套系统的诊断流程。
技能如何帮你定位问题
这个技能把 Rust 所有权相关的排查拆成五个步骤:
- 诊断 borrow checker 报错:逐一解析 E0505、E0597、E0499 等错误码的含义,定位 borrow 与 move 的时间线冲突点。修复套路是:确定约束 → 缩短借用范围 → 不行就
clone或改用智能指针。 - 生命周期标注:讲清三条 elision rules 能覆盖 90% 场景,只在多个入参引用且返回引用时才需要手动标注。
'static的用途和限制也会说明。 - 智能指针选型:
Box、Rc、Arc、RefCell、Mutex、RwLock、Cow各自适用什么场景,以及单线程到多线程怎么组合。 - 避免
clone()的模式:能借就别拥有,优先用&mut self修改而非消费后重建,用Cow延迟克隆。 - async 生命周期陷阱:
async fn的 Future 捕获所有入参引用,tokio::spawn要求'static,共享数据要Arc持有。
输出包含错误解读、原代码与修改后代码的逐行对照,以及 ASCII 生命周期图示,方便直观看到引用的有效范围。
适用边界
这个技能不负责 Rust 语法入门——如果连 let、match 都没用过,先去读 The Book。它也不管特定框架的用法,比如 Actix、Axum、Bevy 的业务逻辑不在范围内。如果问题是编译错误或智能指针选型,而不是框架配置,这个技能能帮上忙。
使用场景
- Rust 项目编译报 E0505/E0597/E0499,需要定位 borrow 与 move 的时间线冲突并修复
- 在 struct 中持有引用,不确定何时需要手动标注生命周期参数
- 实现图/DAG/AST 数据结构或并发共享状态,需要在 Box/Rc/Arc/RefCell/Mutex 间做选择
- async 代码里 tokio::spawn 报 'static 错误,需要确认被引用的数据如何用 Arc 持有
适合人员
- 用 Rust 写系统服务的后端工程师,borrow checker 报错时想按规则修复而不是无脑 clone
- 从 Java/Python/C++ 转 Rust 的开发者,需要建立所有权与借用的正确直觉
- 写并发或异步服务的 Rust 工程师,需要在 Arc/Mutex/RwLock 间做选型决策
- 实现图、AST 等共享数据结构的 Rust 开发者,要搞清楚 Rc 与 Arc 的边界