48 个版本 (17 个稳定版)
1.1.5 | 2024 年 3 月 5 日 |
---|---|
1.1.3 | 2023 年 8 月 6 日 |
1.1.2 | 2023 年 7 月 2 日 |
1.0.12 | 2022 年 8 月 15 日 |
0.3.2 | 2019 年 3 月 30 日 |
在 Rust 模式 中排名第 14
每月下载量 6,468,363
在 13,168 个 crate 中使用 (844 个直接使用)
64KB
225 行(不包括注释)
pin-project
一个用于安全且便利的 pin 投影 的 crate。
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
pin-project = "1"
编译器支持:需要 rustc 1.56+
示例
#[pin_project]
属性创建覆盖结构体或枚举所有字段的投影类型。
use std::pin::Pin;
use pin_project::pin_project;
#[pin_project]
struct Struct<T, U> {
#[pin]
pinned: T,
unpinned: U,
}
impl<T, U> Struct<T, U> {
fn method(self: Pin<&mut Self>) {
let this = self.project();
let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
let _: &mut U = this.unpinned; // Normal reference to the field
}
}
要在枚举上使用 #[pin_project]
属性,您需要命名方法返回的投影类型。
use std::pin::Pin;
use pin_project::pin_project;
#[pin_project(project = EnumProj)]
enum Enum<T, U> {
Pinned(#[pin] T),
Unpinned(U),
}
impl<T, U> Enum<T, U> {
fn method(self: Pin<&mut Self>) {
match self.project() {
EnumProj::Pinned(x) => {
let _: Pin<&mut T> = x;
}
EnumProj::Unpinned(y) => {
let _: &mut U = y;
}
}
}
}
有关更多详细信息,请参阅 #[pin_project]
属性,并在 示例 目录中查看更多示例和生成的代码。
相关项目
- pin-project-lite:使用声明式宏编写的 pin-project 的轻量级版本。
许可证
根据您的选择,在 Apache 许可证第 2 版 或 MIT 许可证 下许可。
除非您明确说明,否则任何有意提交给作品并由您包含的贡献,根据 Apache-2.0 许可证定义,将根据上述许可证双重许可,而无需任何额外的条款或条件。
依赖关系
~280–730KB
~17K SLoC