6个版本 (破坏性更新)

0.7.0 2022年6月18日
0.6.1 2022年6月18日
0.6.0 2022年1月29日
0.4.0 2021年11月11日
0.2.0 2021年11月9日

#19 in #dynamic-dispatch

每月下载量 30
用于 2 个crate(通过 async_t

MIT 协议

24KB
551 代码行

async_t

这个库允许在编译时实现无成本的async特质。此库需要启用nightly和功能 generic_associated_typestype_alias_impl_trait。在稳定版本编译时将自动使用dtolnay的async_trait。

它支持正常特质所能支持的所有功能,除了

  • 默认的异步方法
  • 空白实现
  • 动态分派

它也可能在与需要指定生命周期的地方有问题。

// 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::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
    }
}

依赖

~1.5MB
~36K SLoC