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 |
|
#49 in Rust 模式
9,537,385 个月下载量
在 39,851 个 crate 中使用 (739 直接)
66KB
1K SLoC
pin-project-lite
使用声明式宏编写的 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。
不同:无 proc-macro 相关依赖
这是使用此 crate 的唯一原因。但是,如果您的 crate 依赖图中已经存在 proc-macro 相关的依赖项,则使用此 crate 并无益处。(注意:在 pin-project 和 pin-project-lite 之间生成的代码量几乎没有区别。)
不同:无有用的错误信息
此宏不处理任何无效的输入。因此,错误信息在大多数情况下并不实用。如果确实需要有用的错误信息,则可以在出错时将相同的输入传递给 pin-project,以接收有关编译错误的有帮助的描述。
不同:不支持自定义 Unpin 实现
pin-project通过UnsafeUnpin
支持这一点。(!Unpin
同时由pin-project和pin-project-lite支持。)
不同之处:不支持元组结构和元组变体
pin-project支持这一点。
许可证
您可以选择在Apache许可证,版本2.0或MIT许可证下获得许可。
除非您明确声明,否则您提交的任何旨在包含在作品中的贡献(根据Apache-2.0许可证的定义),应如上所述双重许可,而不附加任何额外的条款或条件。