引脚

主要观点Pin类型是 Rust 异步生态系统的基础,但也是最难理解和使用的部分,本文旨在解释Pin的作用、由来及当前问题。
关键信息

  • Pin旨在使编译器生成的自引用类型或在运行时用不安全代码实现的自引用类型的操作更安全。
  • 曾尝试基于Move特质的解决方案但存在局限性,如不能满足有时先引用后自引用的需求,且作为?Trait添加不兼容。
  • 最终设计了Pin类型,通过包装指针将对象置于固定状态,避免了兼容性问题,但在可用性方面存在诸多问题。
  • Pin的问题包括需使用不安全代码来修改固定对象、缺少类似“重新借用”等特性、固定投影相关问题及与Drop特质的不良交互等。
    重要细节
  • 在异步函数中为支持引用需存储在Future中,会产生自引用问题,如Bar示例。
  • 移动构造函数和偏移指针不是解决自引用移动问题的有效方法。
  • Ralf Jung 提出的“固定类型状态”概念,有三种状态:拥有、共享和固定。
  • Pin是一个包装类型,可包裹各种指针,大多数类型有Unpin特质,可安全移动。
  • Pin的最大优势是向后兼容,添加后不影响其他代码。
  • Pin在可用性方面的问题导致用户困惑,如无“重新借用”、特殊set方法等,固定投影问题更复杂且与Drop特质交互不良。
阅读 13
0 条评论