主要观点:
- 通过引入
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,并对DropWhileBorrowed和Swap特质的含义和作用进行了详细解释。
常见问题及解答:
- 关键要点包括使
Pin平滑融入 Rust 的两个改变,即限制类型交换能力和集成固定到自动引用规则及借用检查器。 Overwrite特质对除固定外的其他操作也有影响,可想象DropWhileBorrowed和Swap特质来更精确控制值的丢弃和移动。- 提议同时退出
Overwrite和Swap是为了获得真正的不可变字段等额外好处。 - 可将
Overwrite命名为Mobile,但难以为DropWhileBorrowed找到语义名称。 DropWhileBorrowed和Swap特质都与所有者在借出局部变量后的行为有关,影响局部变量存储的值。- 对于“相同值”的定义,每个结构体都有隐藏的
$identity字段来表示其身份,相同身份的结构体为相同值。 - 文中的推理经过了多次讨论和修正,如对定理 B 的证明进行了补充说明。
- 作者对状态图最满意,它有助于理解
Pin的相关概念和行为。 - 该提议不完全向后兼容,未来需要思考如何进行过渡,如添加
Overwrite边界等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。