主要观点:
- 介绍 Rust 的
Pin
类型目标及历史,最初开发 API 时为尽快推出异步/等待语法的“最小可行产品”,Pin
是标准库中的类型,仅可作为方法接收者使用,存在“复杂性悬崖”。 - 提出语言更改建议,使与固定引用的交互更类似于普通引用,包括区分固定和非固定位置、引入原生固定引用语法、在方法解析中处理固定等。
- 阐述位置和值的概念,在 Rust 中是位置具有可变或不可变等属性,而不是值。
- 强调固定位置的关键思想,通过语言直接强制固定位置规则,可在栈上创建固定绑定,
Unpin
类型的固定位置有不同限制。 - 介绍原生固定引用,
&pinned T
和&pinned mut T
是现有Pin<&T>
和Pin<&mut T>
的语法糖,固定引用操作符更符合习惯且功能强大。 - 说明在方法解析中处理固定,使固定在调用方法时更自然,类似普通可变方法。
- 使
Pin
方法更易实现,如添加固定方法接收者的语法糖、支持安全固定投影等。 - 以
Join
未来的实现为例展示代码变化,说明固定引用的使用。 - 对比新的“不可移动类型”提案,认为将“被固定”表示为类型的属性会引入额外复杂性且不兼容现有生态,而将“可固定”表示为类型属性更好,且所提更改与现有
Pin
API 完全兼容。 - 提到存在比
Pin
更好但不兼容现有 Rust 的设计,但考虑到向后兼容性,认为将“固定位置”概念集成到语言中是更好的选择。
关键信息:
Pin
最初为尽快推出异步/等待语法而设计,存在使用困难。- 区分固定和非固定位置,引入相关语言特性。
- 位置和值的概念及在 Rust 中的体现。
- 原生固定引用语法及操作符。
- 在方法解析中处理固定的方式。
- 使
Pin
方法更易实现的措施。 - 与“不可移动类型”提案的对比。
重要细节:
- 位置可通过多种方式创建,如通过固定指针、在栈上创建固定绑定等。
- 固定引用操作符可重复应用,与普通引用类似。
- 固定方法接收者的特殊语法。
- 安全固定投影需添加注释,字段也可标记是否在固定状态。
Drop
方法在处理固定字段时的特殊要求。- 新的
Join
实现展示固定引用的使用。 - “不可移动类型”提案的复杂性和不兼容性。
- 所提更改可在不破坏现有异步生态的情况下添加到 Rust 中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。