#声明式宏 #pin # #no-alloc

no-std pin-project-lite

使用声明式宏编写的 pin-project 的轻量级版本

11 个版本

0.2.14 2024 年 3 月 29 日
0.2.13 2023 年 8 月 25 日
0.2.10 2023 年 7 月 2 日
0.2.9 2022 年 4 月 26 日
0.1.1 2019 年 11 月 15 日

#49 in Rust 模式

Download history 2016112/week @ 2024-04-27 2041959/week @ 2024-05-04 2120333/week @ 2024-05-11 2110469/week @ 2024-05-18 2089258/week @ 2024-05-25 2308939/week @ 2024-06-01 2230306/week @ 2024-06-08 2225478/week @ 2024-06-15 2240828/week @ 2024-06-22 2103009/week @ 2024-06-29 2305564/week @ 2024-07-06 2292039/week @ 2024-07-13 2383548/week @ 2024-07-20 2368587/week @ 2024-07-27 2314948/week @ 2024-08-03 2100854/week @ 2024-08-10

9,537,385 个月下载量
39,851 个 crate 中使用 (739 直接)

Apache-2.0 OR MIT

66KB
1K SLoC

pin-project-lite

crates.io docs.rs license rust version github actions

使用声明式宏编写的 pin-project 的轻量级版本。

用法

将此添加到您的 Cargo.toml

[dependencies]
pin-project-lite = "0.2"

编译器支持:需要 rustc 1.37+

示例

pin_project! 宏创建一个覆盖结构体所有字段的投影类型。

use std::pin::Pin;

use pin_project_lite::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_lite::pin_project;

pin_project! {
    #[project = EnumProj]
    enum Enum<T, U> {
        Variant { #[pin] pinned: T, unpinned: U },
    }
}

impl<T, U> Enum<T, U> {
    fn method(self: Pin<&mut Self>) {
        match self.project() {
            EnumProj::Variant { pinned, unpinned } => {
                let _: Pin<&mut T> = pinned;
                let _: &mut U = unpinned;
            }
        }
    }
}

pin-project 与 pin-project-lite

以下是与 pin-project 相比的一些相似之处和不同之处。

相似:安全性

pin-project-lite 以与 pin-project 相似的方式保证安全性。两者在您编写其他不安全代码的情况下都是完全安全的。

不同:最小化设计

此库没有像 pin-project 那样解决广泛的用例。如果您的用例尚未涵盖,请使用 pin-project

这是使用此 crate 的唯一原因。但是,如果您的 crate 依赖图中已经存在 proc-macro 相关的依赖项,则使用此 crate 并无益处。(注意:在 pin-project 和 pin-project-lite 之间生成的代码量几乎没有区别。)

不同:无有用的错误信息

此宏不处理任何无效的输入。因此,错误信息在大多数情况下并不实用。如果确实需要有用的错误信息,则可以在出错时将相同的输入传递给 pin-project,以接收有关编译错误的有帮助的描述。

不同:不支持自定义 Unpin 实现

pin-project通过UnsafeUnpin支持这一点。(!Unpin同时由pin-projectpin-project-lite支持。)

不同之处:不支持元组结构和元组变体

pin-project支持这一点。

许可证

您可以选择在Apache许可证,版本2.0MIT许可证下获得许可。

除非您明确声明,否则您提交的任何旨在包含在作品中的贡献(根据Apache-2.0许可证的定义),应如上所述双重许可,而不附加任何额外的条款或条件。

无运行时依赖