mcpField
R
rust-ownership-borrowing

rust-ownership-borrowing

github.com/lvtd-llc开发160 次安装8 周前更新
代码仓库

关于 rust-ownership-borrowing

面向 Rust 开发者的所有权与借用技能,帮助所有权设计贴合程序的数据流。它引导开发者分析值的生命周期、访问方式、修改需求和共享所有权。

主要功能

  1. 01识别值的所有者与访问需求
  2. 02选择拥有或借用的函数参数
  3. 03在修改前缩短借用范围
  4. 04有意地移动或克隆值
  5. 05设计共享所有权与内部可变性
  6. 06检查生命周期和所有权约束

适用场景

  1. 01解决借用检查器错误
  2. 02审查借用密集型改动
  3. 03选择函数参数类型
  4. 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 所有权与借用

使用此技能,让所有权形态与程序的数据流相匹配。将借用检查器错误视为设计反馈:确定每个值由谁拥有、访问需要持续多久,以及修改是否需要独占访问或采用不同的数据形态。

核心工作流

  1. 确定每个跨越出错代码路径的值由谁拥有。
  2. 确定每个函数所需的访问方式:获取所有权、共享借用、可变借用或共享所有权。
  3. 先缩短借用,再更改类型。引入代码块、临时值、辅助函数,或提前提取数据,确保引用在修改前结束。
  4. 如果调用方不再需要某个值,优先移动它。如果调用方仍保留所有权,优先借用。只有在有意实现重复所有权且成本可接受时才克隆。
  5. 在考虑使用 Rc<RefCell<_>> 之前,先用 ID、索引、arena 或所有权树替代自引用或图状设计。
  6. 单线程共享所有权使用 Rc,跨线程共享所有权使用 Arc。只有在修改模型明确时,才添加 Cell、RefCell、Mutex 或 RwLock。
  7. 添加测试,覆盖所有权敏感的行为,而不只是触发修改的编译器错误。

签名规则

  • 函数会消耗或存储该值时,接收 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