impl上的第一个显式生命周期说明符是什么意思?

时间:2016-09-06 18:54:17

标签: rust lifetime

impl上有三种不同的生命周期说明符:

impl<'a> Type<'a> {
    fn my_function(&self) -> &'a u32 {
        self.x
    }
}

Type<'a>声明在此impl声明中有生命周期。返回类型-> &'a u32上的那个表明接收返回值的变量不应该在......之前死掉?在类型Type的对象死亡之前?

与此有何不同:

impl TextEditor {
    //Other methods omitted ...

    pub fn get_text<'a>(&'a self) -> &'a String {
        return &self.text;
    }
}

这里说的是返回类型在&'a self的生命周期结束之前不会死亡。

最后一个是否只声明了这个方法的生命周期,而另一个方法声明了impl声明中每个方法(和关联函数?)的生命周期?

2 个答案:

答案 0 :(得分:11)

在这两种情况下,

'a都是 生命周期参数 。这是一种通用参数,因此每次使用Type或每次使用get_text都可以选择不同的&#34;值&#34;对于那个通用参数。除非您使用'static

,否则程序员不会明确选择实际生命周期

编译器将推断'a的每个值Typeget_text的每次使用应该是impl<'a>

impl<'a> Type<'a> { .. }为整个impl块引入了一个新的生命周期参数。然后在类型中使用它:'a

Type的确切含义取决于Type定义中的使用方式。从您的示例中,我猜struct Type<'a> { x: &'a u32, } 就是这样:

'a

此定义为:对于每个生命周期x: &'a u32,定义类型以包含引用Type。所以impl<'a> Type<'a> { .. }是通用的,可以存储任何生命周期的引用。

'a读取:对于每个生命周期Type<'a>,请为类型Type定义方法。

由于我们现在知道'a的结构定义,我们知道impl块中的Type参数总是等于'a中的引用的生命周期。 sx field。

  

返回类型上的那个 - &gt; &amp;&#;; u32告诉我   接收返回值的变量不应该死亡   之前...之前是什么?在Type类型的对象死之前?

Type<'a>是存储在'a值内的引用的生命周期,它与Type值本身没有其他关系。唯一的规则是&'a u32必须比Type值本身更长,因为不允许在其生命周期结束时存储引用。所以事实上,我们可以坚持Type,直到impl TextEditor { //Other methods omitted ... pub fn get_text<'a>(&'a self) -> &'a String { return &self.text; } } 值死亡,甚至更长时间。

&self

这很常见。 get_text是对自我价值的引用 - 借用 - 方法'a也是一个通用项目。它有一个通用参数 - 一个生命周期参数。

对于任何生命周期&'a self,它都会读取self作为引用&self(该生命周期的引用)并返回对具有相同生命周期的String的引用。

在输入&String和输出get_text上使用相同的参数意味着它们已连接,只要返回的String引用处于活动状态,Rust就会将self视为借用。< / p>

同样,方法'a是通用的,编译器将选择一个&#34;值&#34;对于方法的每次使用,self。它是一种可以返回String的长期借用的方法,具体取决于您允许它借用&String的时间长度。有时它会选择较长的生命周期,以便您可以长时间保持返回的get_text。如果您根本不使用返回的值,&'a String的某些用法将使用较短的生命周期。

在这种情况下,由于我们发现&'a self直接与TextEditor值的借用TextEditor绑定,因此我们知道我们最多只能将String引用保留为只要我们可以借用includesSubentities值。

答案 1 :(得分:8)

解释Rust代码:

impl<'a>

“如果你给我一辈子......”(编译器通常在使用类型时根据上下文提供此内容)

         Type<'a> {

“......我将介绍如何实施Type<'a>”。所以Type可能包含引用(需要一生)。

    fn my_function(&self) -> &'a u32 {

“...并且引用了Type<'a>,您致电my_function()以获取对u32生命周期'a的引用。”请注意,&self引用的生命周期与'a没有直接关联;它可以更短(但通常不长于'a,因为类型不能超过包含的引用。)

在第二种情况下:

impl TextEditor {

“以下是如何实现非生命周期参数类型TextEditor ...”

pub fn get_text<'a>

“给定您可以选择的生命周期'a(这是输入参数)......”

                   (&'a self)

“......以及对至少TextEditor生活的'a的引用。”

                             -> &'a String {

“...您可以调用get_text方法,并获得对同一时间生活的String的借用引用。”

更实际的说,这实际上意味着String直接从TextEditor重新借用 - 只要String引用存活,&self借用就是被认为仍处于活跃状态,您将无法接受任何&mut个引用。