为什么`Pin`是特质签名的一部分(以及为什么这是个问题)

主要观点:

  • 解释了Future::poll方法中self: Pin<&mut Self>出现在签名中的原因,通过示例说明在不同情况下如何使用Pin以及其与impl Trait等的关系。
  • 探讨了Pin在方法签名中的影响,对于希望与固定值一起工作的特性,需使用self: Pin<&mut Self>,如Iterator需引入新特性PinnedIterator,这导致了大量的特性重复。
  • 提出了关于广义自引用类型设计的一些要点,如标记类型不可移动、转换类型移动性等,并介绍了相关的设计,如Move自动特性等。

关键信息:

  • Pin可用于表达类型在固定后可实现特定特性,如for<'a> Pin<&'a mut T>: MyTrait
  • MyTrait::my_methodself的类型为&mut Pin<&mut Self>,可通过Pin::as_mut转换为拥有类型。
  • 对于impl Trait在关联位置和返回位置的使用限制,以及Pin直接作为方法签名的一部分的解决方案。
  • Iterator为例,说明为了支持固定值,需引入新特性PinnedIterator,导致特性重复。
  • 强调Pinstd::lib的严格向后兼容性要求之间的相互作用,以及对设计广义自引用类型的启示。

重要细节:

  • 展示了通过my_function函数示例说明Pin的使用和转换,如let pinned_input = pin!(input)
  • 提到PoignardAzur的相关工作,如描述固定类型的原地构造等。
  • 指出在讨论Pin的可行性时应考虑这些影响,鼓励分享其他可能的方法。
阅读 11
0 条评论