现在我已经让自己对Rust生活中的基本概念有点熟悉,我面临着不同的问题。我很难用生命周期语法来解决这个问题。
在Rust中使用生命周期注释的哪种语法时,是否有一般规则?在我看来,语法上有很多变化,当我想在某个地方添加生命周期时,我总是不得不四处寻找正确的语法。
我遇到了:
without lifetime with lifetime
Vec<Route> Vec<Route<'a>>
&Route &'a Route
impl Clone for Route impl<'a> Clone for Route<'a>
|| ||:'a
语法有很多不同的变体。有时您从Vec<Route>
转到<Vec<Route<'a>>
,意味着您必须引入尖括号。有时您只需从&Route
转到&'a Route
,因此您只需在现有代码中添加'a
。您需要添加:'a
的不同时间。我也不知道为什么我们还需要将<'a>
添加到impl
关键字。
为了更清楚,为什么不说生命期总是^a
或者某些东西,以便上面的列表可以归结为:
without lifetime with lifetime
Vec<Route> Vec<Route^a>
&Route &^a Route (or Route^a ?)
impl Clone for Route impl Clone for Route^a
|| ||^a
答案 0 :(得分:3)
Rust区分生命周期声明和使用。生命周期仅用于参考。
&'a Bar
表示生命周期a由Bar的引用使用。
<'a>
宣告一生。这意味着前面的项目(例如Foo<'a>
或fn do_stuff<'a>
)包含一个或多个需要生命周期注释的引用。
据我所知,||
实际上是对闭包对象的引用(此时正在重做闭包)。
编辑:为了完整性,不必声明'static
生命周期。
答案 1 :(得分:2)
这里只有两个用例:类型参数和引用。要将类型参数添加到任何类型,您需要添加尖括号。并非每种类型都有类型参数,有时您可以匿名并推断它们。但是,每个引用都具有生命周期,并且很少会被推断或匿名。因此,让我们按照生命周期中出现的位置对原始示例进行分类:
Vec<Route>
vs Vec<Route<'a>>
&Route
vs &'a Route
impl Clone for Route
vs impl<'a> Clone for Route<'a>
||
vs ||:'a
请注意,作为一个类型参数,离开生命周期很少是合法的(好吧,正如dbaupp所指出的那样,就像你可以将它从参考文献中删除一样有效,但是它会出现更多经常在实践中)。作为一种&#34;种类&#34;绑定,它使用与类型参数上的边界相同的语法。使用相同的生命周期和类型参数语法可以满足两个要求,其中一个比另一个更实用:
Route<'a, 'b>
Route^a<T>
?