什么是特质+'一生



我正在读异步书。在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的组合,每个组合又是TraitBoundLifetime(边界)。

用+语法指定多个特征界限详细描述了我们可以组合多个特征边界,但终身界限也是如此(在语法允许的情况下)。有人可能会说,这一节还应该提到寿命界限。

不完全熟悉,但从逻辑上讲它是有意义的:

函数返回Future,完成后返回一个字节当实际执行异步fn时,它会移动x,这是一个具有生命周期的引用。从技术上讲,x可以在Future完成之前丢弃。为了防止这种情况,生存期特性保证函数的返回值至少与x一样长

相关内容

  • 没有找到相关文章

最新更新