进一步简化 Rust 的自引用类型

这篇博客主要讨论了如何在 Rust 中引入自引用类型(SRTs),包括以下几个方面:

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