`Overwrite` 特质和 `Pin` · 初步尝试

主要观点:

  • 通过引入Overwrite特质替代Unpin特质,使基于Pin的 API 更易编写和调用,让Pin更无缝地融入 Rust 。
  • Pin<&mut T>并非真正的“固定可变引用”,Overwrite特质影响&mut的工作方式,使Pin<&mut Self>成为&mut self的子类型。
  • 提出“自动引用”扩展,使获取Pin<&mut Self>方法像调用&mut self方法一样简单。

关键信息和重要细节:

  • 内存中每个位置都有生命周期,包括未初始化、初始化、固定和释放等状态,固定值不能移动或遗忘,否则会导致未定义行为。
  • 并非所有值都可固定,Unpin类型的值不能被固定,!Unpin类型的值可以被固定且可能是地址敏感的。
  • 目前使用基于Pin的 API 存在两个主要问题:Pin<&mut Self>方法不能使用普通&mut self方法和访问字段,获取固定引用困难。
  • Overwrite特质的引入改变了“位置生命周期”,限制了类型的交换能力,使Pin<&mut Self>成为&mut self的子类型,允许安全的固定投影。
  • 为使调用Pin<&mut Self>方法更简单,需要将编译器的“自动引用”概念扩展为“自动固定引用”,并引入新的语法&pinned mut
  • 文中还对Overwrite特质的名称、相关类型的语义等进行了讨论和思考,如提出用Mobile替代Overwrite,并对DropWhileBorrowedSwap特质的含义和作用进行了详细解释。

常见问题及解答:

  • 关键要点包括使Pin平滑融入 Rust 的两个改变,即限制类型交换能力和集成固定到自动引用规则及借用检查器。
  • Overwrite特质对除固定外的其他操作也有影响,可想象DropWhileBorrowedSwap特质来更精确控制值的丢弃和移动。
  • 提议同时退出OverwriteSwap是为了获得真正的不可变字段等额外好处。
  • 可将Overwrite命名为Mobile,但难以为DropWhileBorrowed找到语义名称。
  • DropWhileBorrowedSwap特质都与所有者在借出局部变量后的行为有关,影响局部变量存储的值。
  • 对于“相同值”的定义,每个结构体都有隐藏的$identity字段来表示其身份,相同身份的结构体为相同值。
  • 文中的推理经过了多次讨论和修正,如对定理 B 的证明进行了补充说明。
  • 作者对状态图最满意,它有助于理解Pin的相关概念和行为。
  • 该提议不完全向后兼容,未来需要思考如何进行过渡,如添加Overwrite边界等。
阅读 8
0 条评论