Pin 与 Unpin
学习目标
- 理解 Pin 的作用
- 理解自引用结构
- 掌握 Unpin trait
核心概念
为什么需要 Pin
Pin<P>
use std::pin::Pin;
let mut data = String::from("hello");
let pinned = Pin::new(&mut data);
Unpin trait
pin_project
[dependencies]
pin-project = "1"
use pin_project::pin_project;
#[pin_project]
struct MyFuture<F> {
#[pin]
inner: F,
data: String,
}
Box::pin
use std::pin::Pin;
fn returns_future() -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async { 42 })
}
小结
| 概念 | 说明 |
|---|
Pin<P> | 防止值被移动的包装 |
Unpin | 标记类型可以安全移动 |
Box::pin | 在堆上创建固定值 |
pin_project | 安全地投影固定结构体的字段 |