我正在读异步书。在async lifetimes
部分中,有一个我不熟悉语法的代码片段:
fn foo_expanded<'a>(x: &'a u8) -> impl Future<Output = u8> + 'a {
async move { *x }
}
在impl Future<Output = u8> + 'a
中,这里的impl Trait + 'lifetime
是什么?
更新:我更多的是问它是什么,而不是终身逻辑解释。官方文件中的定义是非常感谢。
这里的
impl Trait + 'lifetime
是什么?
它是Impl特性,在这里特别用作抽象返回类型
隐含特征
语法
ImplTraitType : impl TypeParamBounds ImplTraitTypeOneBound : impl TraitBound
impl
特性提供了指定未命名但具体的类型的方法实现一个特定的特性。它可以出现在两种地方:参数位置(可以作为匿名类型参数函数)和返回位置(在那里它可以充当抽象返回类型)。trait Trait {} // argument position: anonymous type parameter fn foo(arg: impl Trait) { } // return position: abstract return type fn bar() -> impl Trait { }
其中TypeParamBounds
的语法允许特征界和寿命界
特性和生存期界限
语法
TypeParamBounds : TypeParamBound ( + TypeParamBound )* +? TypeParamBound : Lifetime | TraitBound TraitBound : ?? ForLifetimes? TypePath | ( ?? ForLifetimes? TypePath ) LifetimeBounds : ( Lifetime + )* Lifetime? Lifetime : LIFETIME_OR_LABEL | 'static | '_
特别注意的是,TypeParamBounds
的语法是一个或可选的几个TypeParamBound
的组合,每个组合又是TraitBound
或Lifetime
(边界)。
用+语法指定多个特征界限详细描述了我们可以组合多个特征边界,但终身界限也是如此(在语法允许的情况下)。有人可能会说,这一节还应该提到寿命界限。
不完全熟悉,但从逻辑上讲它是有意义的:
函数返回Future,完成后返回一个字节当实际执行异步fn时,它会移动x
,这是一个具有生命周期的引用。从技术上讲,x
可以在Future完成之前丢弃。为了防止这种情况,生存期特性保证函数的返回值至少与x
一样长