关于 rust-ownership-borrowing
面向 Rust 开发者的所有权与借用技能,帮助所有权设计贴合程序的数据流。它引导开发者分析值的生命周期、访问方式、修改需求和共享所有权。
主要功能
- 01识别值的所有者与访问需求
- 02选择拥有或借用的函数参数
- 03在修改前缩短借用范围
- 04有意地移动或克隆值
- 05设计共享所有权与内部可变性
- 06检查生命周期和所有权约束
适用场景
- 01解决借用检查器错误
- 02审查借用密集型改动
- 03选择函数参数类型
- 04重构自引用或图状数据结构
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill rust-ownership-borrowing安装后在 Claude Code 中输入/rust-ownership-borrowing确认已加载。
附带文件agents/openai.yamlreferences/borrow-patterns.md
详细介绍
Rust 所有权与借用
使用此技能,让所有权形态与程序的数据流相匹配。将借用检查器错误视为设计反馈:确定每个值由谁拥有、访问需要持续多久,以及修改是否需要独占访问或采用不同的数据形态。
核心工作流
- 确定每个跨越出错代码路径的值由谁拥有。
- 确定每个函数所需的访问方式:获取所有权、共享借用、可变借用或共享所有权。
- 先缩短借用,再更改类型。引入代码块、临时值、辅助函数,或提前提取数据,确保引用在修改前结束。
- 如果调用方不再需要某个值,优先移动它。如果调用方仍保留所有权,优先借用。只有在有意实现重复所有权且成本可接受时才克隆。
- 在考虑使用
Rc<RefCell<_>>之前,先用 ID、索引、arena 或所有权树替代自引用或图状设计。 - 单线程共享所有权使用
Rc,跨线程共享所有权使用Arc。只有在修改模型明确时,才添加Cell、RefCell、Mutex或RwLock。 - 添加测试,覆盖所有权敏感的行为,而不只是触发修改的编译器错误。
签名规则
- 函数会消耗或存储该值时,接收
T。 - 函数只在调用期间读取时,接收
&T。 - 函数必须修改该值且不应发生其他访问时,接收
&mut T。 - 除非返回的引用明确关联到某个输入的生命周期,否则返回拥有所有权的值。
- 如果
&[T]、&str或&Path已能表达所需的能力,就避免接收&Vec<T>、&String或&PathBuf。 - 除非结构体确实借用其他地方拥有的数据,否则避免为结构体添加生命周期参数。拥有所有权的字段通常更简单。
常见修复模式
解决非简单的编译器错误或审查大量借用的补丁时,请阅读 references/borrow-patterns.md。
- 在进行可变借用之前,缩小不可变借用的作用域。
- 使用
Option::take、std::mem::take或std::mem::replace移出字段,同时留下有效值。 - 使用
split_at_mut、get_mut、entry、drain和retain等集合 API,避免使用会产生重叠借用的索引模式。 - 如果句柄本身就是预期的所有权句柄,可以自由克隆
Arc、Rc和开销低的 ID;避免为了消除编译器错误而克隆负载数据。 - 只有在显式循环能让借用生命周期更清晰,或能避免隐式捕获时,才将迭代器链改为显式循环。
审查清单
- 所有权符合领域模型;不要仅仅为了绕过借用检查器而包装类型。
Clone是有意使用的;在语义独立性与场景相关时,应通过测试加以验证。- 内部可变性有明确的不变量,且访问范围较小。
- 生命周期描述真实的借用关系,而不是为了让编译器接受代码而不断添加的猜测。
- 异步或多线程代码使用
Arc和合适的同步原语;Rc和RefCell不用于跨线程路径。
评论
支持 Markdown