rust 请用自我参照来解释这个特点

ryhaxcpt  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(98)

我把这个特性看作是传递异步函数引用的一种方式,我不理解它

trait AsyncSingleArgFnOnce<Arg>: FnOnce(Arg) -> <Self as AsyncSingleArgFnOnce<Arg>>::Fut {
    type Fut: Future<Output = <Self as AsyncSingleArgFnOnce<Arg>>::Output>;
    type Output;
}

我尤其不理解在函数返回中引用trait的super trait。
看起来很多trait文本都是在正确的地方使用关联类型。

h43kikqp

h43kikqp1#

首先,我们有一个trait AsyncSingleArgFnOnce,它带有一个泛型参数Arg
它有一个关联的类型Output,指定async fn的声明返回类型。
然后它有另一个关联的类型Fut,它指定async fn的实际返回类型。

async fn foo() -> Bar { ... }

实际上是:

fn foo() -> impl Future<Output = Bar> { async move { ... } }

所以Output就是BarFut就是impl Future
这个关联类型被约束为future(type Fut: Future<Output = ...>),其输出类型是<Self as AsyncSingleArgFnOnce<Arg>>::OutputAsyncSingleArgFnOnce<Arg>只是trait本身; <Self as AsyncSingleArgFnOnce<Arg>>::Output是实现类型trait AsyncSingleArgFnOnce的完全限定的Output关联类型,即,只是关联类型Output的值。
trait将FnOnce(Arg) -> ...作为超trait,这意味着它需要是一个函数(FnOnce),接受Arg(泛型参数)并返回<Self as AsyncSingleArgFnOnce<Arg>>::Fut,就像<Self as AsyncSingleArgFnOnce<Arg>>::Output一样,这只意味着关联类型Fut的值。
所以我们有一个trait,它要求一个函数有一个参数和一个future返回类型,future返回的是Fut;声明的返回类型是相关联的类型Output

相关问题