【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。
➡️