3 个不稳定版本
0.1.0-pre.1 | 2023年4月25日 |
---|---|
0.0.2 | 2023年4月25日 |
0.0.1 | 2023年4月22日 |
169 在 #futures
每月 31 下载
用于 named-future
25KB
443 行
named-future: 给你的 Future 起个名字!
将 Future
包装在一个有大小(sized)的结构体中,这样它就可以在 traits 中使用,或者作为返回类型,而无需使用 Box<…>
、dyn …
或 impl …
。
这是一个直到 #![feature(type_alias_impl_trait)]
稳定之前的一个简单解决方案
/// A slow multiplication
///
/// # Struct
///
/// Future generated by [`slow_mul`]
#[named_future]
pub async fn slow_mul(factor1: u32, factor2: u32) -> u32 {
sleep(Duration::from_secs(5)).await;
factor1 * factor2
}
扩展为
/// A slow multiplication
pub fn slow_mul(factor1: u32, factor2: u32) -> SlowMul {
...
}
/// Future generated by [`slow_mul`]
pub struct SlowMul {
...
}
impl Future for SlowMul {
type Output = u32;
#[inline]
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
...
}
}
此外,它还将实现一个 Drop
,以便被丢弃的 future 可以正常工作,并为您的方便实现 Debug
。
proc_macro #[named_future]
有以下可选参数
-
#[named_future(Send)]
-
#[named_future(Sync)]
- 为生成的
struct
实现Sync
。请参阅Send
的说明。
- 为生成的
-
#[named_future(type = Name)]
- 默认名称之外,即使用函数名的Pascal大小写,您可以使用此参数覆盖名称。您还可以使用此参数覆盖
struct
的可见性:type = pub Name
。默认情况下,函数的可见性会被复制。
- 默认名称之外,即使用函数名的Pascal大小写,您可以使用此参数覆盖名称。您还可以使用此参数覆盖
-
#[named_future(crate = some::path)]
- 如果您已将依赖项在您的
Cargo.toml
中重命名,例如renamed = { package = "named-future", version = "0.0.1" }
,那么您必须指定其名称/路径。默认为::named_future
。
- 如果您已将依赖项在您的
要为您的函数和生成的结构体添加文档,您可以使用一行 /// # Struct
将这两个部分分开。
库代码可以与 #![no_std]
一起使用。
由于Rust的限制,目前无法为泛型函数实现“命名future”:错误:“在匿名常量中目前不允许泛型 Self
类型”。
受到Jun Ryung Ju先前工作的启发:rename-future
依赖项
~0.3–0.8MB
~19K SLoC