【Rust日报】2023-07-18 Pin- 温故而知新

💡 原文中文,约6300字,阅读约需15分钟。
📝

内容提要

这篇文章讲解了在Rust中的Pin/Unpin的概念,Pin是一种指针,用于处理自引用结构,Unpin是一个Trait,标记类型在被固定后可以安全地移动。为了处理自引用结构,需要使用Pin来防止移动。在拥有所有权的Future进行await时,编译器可以处理固定。否则,需要使用pin!或Box::pin来处理固定。大多数结构是Unpin的,但async fn和async {}总是产生!Unpin结构。

🎯

关键要点

  • Pin 是一种指针,类似于 &mut T 和 &T 之间的折中。
  • Pin<&mut T> 表示该值可以被修改但不能被移动。
  • 自引用数据结构需要使用 Pin 来防止移动。
  • async fn 和 async {} 产生的 Future 是 !Unpin 结构。
  • 编译器可以处理拥有所有权的 Future 的固定。
  • 使用 pin! 或 Box::pin 来处理固定。
  • Unpin 是一个 Trait,标记类型在被固定后可以安全地移动。
  • 大多数结构是 Unpin,但 async fn 和 async {} 产生的结构总是 !Unpin。
  • Pin 确保在值被丢弃之前,移动它所指向的值是不安全的。
  • Box::pin 可以安全地调用不安全的 Pin::new_unchecked。
➡️

继续阅读