| 0.1.0-pre.2 |
|
|---|---|
| 0.0.1 |
|
#291 in #asynchronous
27 每月下载量
18KB
128 行
named-future: 给你的 Future 起个名字!
将 Future 包裹在一个有大小结构的类型中,这样它就可以用作 trait 或返回类型,而无需使用 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 的限制,目前无法为泛型函数实现“命名未来”:错误:“当前不允许在匿名常量中使用泛型 Self 类型”。
受 Jun Ryung Ju 之前工作的启发:rename-future
依赖项
~110KB