225 字
1 分钟
Rust 为什么需要 Pin
原文
https://blog.cloudflare.com/pin-and-unpin-in-rust/
自引用类型的问题
- 自引用类型包含指向自身的指针
- 当这种类型被移动时,内部指针可能会失效,导致未定义行为
Pin 和 Unpin 的解决方案
- Unpin:可以安全移动的类型会自动实现 Unpin trait。
- !Unpin:不能安全移动的类型。
- Pin:包装一个指针,防止其指向的值被移动。
使用 Pin
- Future 的 poll 方法接收
Pin<&mut Self>
参数。 - 需要编写投影(projection)方法来安全地访问 Pin 包装的结构体字段。
- 可以使用 pin-project crate 来自动生成安全的投影方法。
总结
- Pin 使得自引用类型(如某些 Future)可以安全使用。
- 大多数类型默认实现 Unpin,不需要特别处理。
- 对于 !Unpin 类型,使用 Pin 可以保证安全性。
- 实际编程中,可以利用 pin-project crate 简化 Pin 的使用。
Rust 为什么需要 Pin
https://blog.lpkt.cn/posts/rust-pin/