我把这个特性看作是传递异步函数引用的一种方式,我不理解它
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文本都是在正确的地方使用关联类型。
1条答案
按热度按时间h43kikqp1#
首先,我们有一个trait
AsyncSingleArgFnOnce
,它带有一个泛型参数Arg
。它有一个关联的类型
Output
,指定async fn
的声明返回类型。然后它有另一个关联的类型
Fut
,它指定async fn
的实际返回类型。实际上是:
所以
Output
就是Bar
,Fut
就是impl Future
。这个关联类型被约束为future(
type Fut: Future<Output = ...>
),其输出类型是<Self as AsyncSingleArgFnOnce<Arg>>::Output
。AsyncSingleArgFnOnce<Arg>
只是trait本身;<Self as AsyncSingleArgFnOnce<Arg>>::Output
是实现类型traitAsyncSingleArgFnOnce
的完全限定的Output
关联类型,即,只是关联类型Output
的值。trait将
FnOnce(Arg) -> ...
作为超trait,这意味着它需要是一个函数(FnOnce
),接受Arg
(泛型参数)并返回<Self as AsyncSingleArgFnOnce<Arg>>::Fut
,就像<Self as AsyncSingleArgFnOnce<Arg>>::Output
一样,这只意味着关联类型Fut
的值。所以我们有一个trait,它要求一个函数有一个参数和一个future返回类型,future返回的是
Fut
;声明的返回类型是相关联的类型Output
。