这篇博客主要讨论了如何在 Rust 中引入自引用类型(SRTs),包括以下几个方面:
- 并非所有自引用类型都是
!Move
:Niko Matsakis 指出并非所有自引用类型都必须是!Move
,例如存储在堆上的数据的类型不必是!Move
,对于堆分配类型,只需要一种初始化方式(视图类型)和描述自生命周期的能力即可。 'self
生命周期不足:Mattieum 指出'self
可能不够,需要能够指向单个字段来描述生命周期,Niko 提出了基于位置的生命周期的特性,用路径代替'self
可以更好地处理可变情况。- 自动引用稳定性:对于存储在堆上的自引用类型不需要编码
!Move
,编译器可以在移动结构时更新指针,以确保引用稳定性,但对于'unsafe
引用或实际的指针则需要Relocate
trait。 - 原始指针操作和自动引用稳定性:编译器可以保证一些操作的正确性,但对于原始指针操作如
ptr::swap
不能保证,需要引入新的自动标记 traitTransfer
来解决这个问题。 Relocate
应该接受&own self
:Relocate
trait 应该接受&own self
,而不是&mut self
,这样可以正确地编码语义,需要-> super Self
语法来构造类型。- 重新设计动机示例:通过使用路径生命周期和编译器自动保存引用稳定性,可以简化代码,无需引用
Move
或就地构造。 - 何时仍需要不可移动类型:不可移动类型有其好处,如在与 FFI 结构交互或高性能数据结构中,但如果编译器不需要它们来提供自引用,它们可以作为优化添加,
async {}
应该返回impl IntoFuture
。 - 结论:作者倾向于将内置指针更新作为语言的一部分来实现自引用类型,而不是不可移动类型,但如果需要不可移动类型,之前的设计也是可行的,实现自引用类型需要逐步添加特性,
'unsafe
似乎并不遥远,作者对实现自引用类型感到乐观。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。