主要观点:
- 通过引入
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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。