Rust编译器至今还不支持async trait,这导致我们没办法给自己的library定义async trait。

trait Foo {
    async fn foo_method(&self) -> i32;
}

实际上当我们定义一个async函数时,编译器会将其去语法糖变成下面这个样子。

async fn foo() -> i32 { /* ... */ }
// desugars to:
fn foo() -> impl Future<Output = i32> { /* ... */ }

每一个函数返回的future,都是编译器生成了一个匿名类型,然后给这个匿名类型实现了Future trait。那也就是说当我们定义一个async trait的时候,假设有下面两个实现,那实际上编译器会给每个函数都生成一个匿名类型,这也就导致相同的trait方法,其返回类型是不同的。因此这就导致了我们没办法准确定义这个futrue返回类型。

// These two `foo_method`s return distinct types, that both implement Future.
impl Foo for i32 {
    async fn foo_method(&self) -> i32 {
       /* ... */
    }
}

impl Foo for String {
    async fn foo_method(&self) -> i32 {
       /* ... */
    }
}

RFC-1522-conservative_impl_trait 这个RFC中实际也描述了,我们并不能在trait定义中使用impl trait,

曲线救国,不用编译器给我们生成的匿名类型,自己定义返回的future是不是就OK了呢。

trait Foo {
    type _Future: Future<Output = i32>;
    fn foo_method(&self) -> Self::_Future;
}
async fn foo_method<'a>(&'a self) -> i32;

// The returned Future must live at least as long as the reference to self:
fn foo_method<'a>(&'a self) -> impl Future<Output = i32> + 'a;

异步函数中存在问题,

trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>:
}