我认为这个特性是传递引用到异步函数的一种方式。我不明白
trait AsyncSingleArgFnOnce<Arg>: FnOnce(Arg) -> <Self as AsyncSingleArgFnOnce<Arg>>::Fut {
type Fut: Future<Output = <Self as AsyncSingleArgFnOnce<Arg>>::Output>;
type Output;
}
我特别不理解在函数return中引用trait的超级trait。
看起来很多trait文本都是在正确的地方使用关联类型。
首先,我们有一个性状AsyncSingleArgFnOnce
,它有一个泛型参数Arg
。
关联类型Output
,指定async fn
声明的返回类型。
然后它有另一个关联类型Fut
,它指定async fn
的实际返回类型。记住:
async fn foo() -> Bar { ... }
实际上是:
fn foo() -> impl Future<Output = Bar> { async move { ... } }
所以Output
是Bar
,Fut
是impl Future
。
此关联类型被约束为输出类型为<Self as AsyncSingleArgFnOnce<Arg>>::Output
的future (type Fut: Future<Output = ...>
)。AsyncSingleArgFnOnce<Arg>
就是性状本身;<Self as AsyncSingleArgFnOnce<Arg>>::Output
是实现类型的特性AsyncSingleArgFnOnce
的完全限定Output
关联类型。也就是说,只是关联类型Output
的值。
性状具有FnOnce(Arg) -> ...
作为超性状,这意味着它需要是一个函数(FnOnce
),它接受Arg
(泛型参数)并返回<Self as AsyncSingleArgFnOnce<Arg>>::Fut
。和<Self as AsyncSingleArgFnOnce<Arg>>::Output
一样,它只表示关联类型Fut
的值。
所以我们有一个trait,它需要一个函数,只有一个参数和一个未来返回类型。返回的future类型为Fut
;声明的返回类型为关联类型Output
。