Pin 与 Unpin
学习目标
- 理解 Pin 的作用
- 理解自引用结构
- 掌握 Unpin trait
核心概念
为什么需要 Pin
// async 块编译后是自引用结构体
// 自引用结构体不能安全移动(指针会失效)
// Pin 保证值不会被移动
Pin<P>
use std::pin::Pin;
// Pin<P> 包裹一个指针 P
// 保证 P 指向的值不会被移动
let mut data = String::from("hello");
let pinned = Pin::new(&mut data);
// pinned 保证 data 不会被移动
Unpin trait
// 大部分类型自动实现 Unpin
// 实现 Unpin 的类型可以安全地从 Pin 中取出
// !Unpin 的类型:
// - async 块生成的 Future
// - 用 #[pin] 标记的类型
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 | 安全地投影固定结构体的字段 |
练习编辑器
rust
Loading...