我怎样才能更好地记住何时使用哪种生命周期语法?

时间:2014-06-17 19:15:18

标签: rust object-lifetime

现在我已经让自己对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

2 个答案:

答案 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>
  • &#34;类&#34;限制:|| vs ||:'a

请注意,作为一个类型参数,离开生命周期很少是合法的(好吧,正如dbaupp所指出的那样,就像你可以将它从参考文献中删除一样有效,但是它会出现更多经常在实践中)。作为一种&#34;种类&#34;绑定,它使用与类型参数上的边界相同的语法。使用相同的生命周期和类型参数语法可以满足两个要求,其中一个比另一个更实用:

    指定多个生命周期的
  1. (更实际)是自然的,Route<'a, 'b>
  2. 结合生命周期和类型参数并不难看。 Route^a<T>