6 个版本 (3 个重大变更)

0.7.0 2022 年 6 月 18 日
0.6.1 2022 年 6 月 18 日
0.6.0 2022 年 1 月 29 日
0.2.1 2021 年 11 月 11 日
0.1.0 2021 年 11 月 9 日

#2551Rust 模式


alhc 中使用

MIT 许可证

6KB
60

async_t

放弃动态分派,获得编译时异步特质(附带一些额外功能)

async_t 提供了一个 #[impl_trait] 宏,允许任何特质返回存在类型;例如 -> impl Future 和一个 #[async_trait] 宏,该宏将您的异步方法包装在 -> impl Future 存在类型下。

这允许完全零成本的异步特质,并允许递归存在返回类型,例如 Result<impl Display, impl Debug>

它可能在需要指定生命周期的位置存在问题。

// spawn example
#[async_trait]
trait Spawn {
    // supports self, &self, &mut self and no self
    async fn spawn() -> JoinHandle<()>;
}

#[async_trait]
impl Spawn for Spawner {
    async fn spawn() -> JoinHandle<()> {
        task::sleep(Duration::from_secs(2)).await; // await inside
        task::spawn(async {
            // ...
        })
    }
}

async fn spawn<T: Spawn>() -> JoinHandle<()> {
    T::spawn().await
}

#[async_trait]
trait Sleeper {
    #[unsend]
    async fn sleep<T>(t: T) -> T;
}

#[async_trait]
impl Sleeper for () {
    #[unsend]
    async fn sleep<T>(t: T) -> T {
        task::sleep(Duration::from_secs(2)).await;
        t
    }
}

async_t 还支持特质中的 impl 返回类型(异步特质旨在设计递归 impl 返回类型)

#[impl_trait] // #[async_trait] can also be used
trait RetDebug {
    fn ret_debug() -> impl Debug;
}

功能

async_t 支持 boxed 功能,这将 async_trait 设置为来自 dtolnay 的 async-trait crate 的一个。

依赖项

~1.5MB
~36K SLoC