#pin #attributes #macro #struct-fields #no-alloc #require

no-std pin-project

一个用于安全且便利的 pin 投影的 crate。

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

Download history 1317084/week @ 2024-04-26 1306206/week @ 2024-05-03 1384977/week @ 2024-05-10 1397510/week @ 2024-05-17 1378815/week @ 2024-05-24 1556579/week @ 2024-05-31 1517079/week @ 2024-06-07 1492526/week @ 2024-06-14 1514932/week @ 2024-06-21 1404739/week @ 2024-06-28 1475929/week @ 2024-07-05 1536588/week @ 2024-07-12 1603161/week @ 2024-07-19 1610535/week @ 2024-07-26 1582712/week @ 2024-08-02 1395367/week @ 2024-08-09

每月下载量 6,468,363
13,168 个 crate 中使用 (844 个直接使用)

Apache-2.0 OR MIT

64KB
225 行(不包括注释)

pin-project

crates.io docs.rs license rust version github actions

一个用于安全且便利的 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