2016-09-06 79 views
5

有上实现了一套三种不同的生命周期符: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

'Type <'a>'很可能包含依赖于'a'的东西。例如。在'slice :: Iter <'a, T>'上,''a'是相应切片的寿命。 ['as_slice(&self) - >&'a [T]'](https://doc.rust-lang.org/std/slice/struct.Iter.html#method.as_slice)可以检索它。 – mcarton

回答

6

'a是在两种情况下,寿命参数。这是一种通用参数,因此每次使用Type或每次使用get_text都可以为该通用参数选择不同的“值”。除非您使用'static,否则程序员不会明确选择实际的生命周期。

编译器会推断'a对于Type的每个值或每个使用get_text应该是什么。

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

究竟是什么'a的含义取决于它如何用于定义Type。从你的榜样,我想这Type是这样的:

struct Type<'a> { 
    x: &'a u32, 
} 

这个定义如下:对于每一个生命周期'a,定义类型包含的参考x: &'a u32。所以Type是通用的,可以存储任何生命周期的引用。

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

由于我们现在知道Type的结构定义,因此我们知道impl块内的'a参数始终等于Type的x字段中引用的生存期。

返回类型的一个 - > &“一个U32告诉之前什么 变量正在接收返回值应该不会死 之前...?类型Type的对象死之前?

'a是存储的Type<'a>的值内的基准的寿命,并且它不具有其他关系到类型值本身。唯一的规则是'a必须超过Type值本身,因为不允许存储超过其寿命终止的引用。所以实际上,我们可以坚持到&'a u32,直到至少值Type价值死亡,也许更长。


impl TextEditor { 
    //Other methods omitted ... 

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

这是非常常见的。 &self是对自我价值的借鉴 - 借用 - 而方法get_text又是一个通用项目。它有一个通用参数 - 一个生命周期参数。

它读取任何生存期'a,借用self作为参考&'a self(该生存期的参考)并返回对具有相同生命期的String的引用。

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

此外,方法get_text是通用的,编译器将为该方法的每次使用选择'a的“值”。这是一种方法,可以返回不同长度的字符串借用,这取决于您允许它借用多长时间self。有时它会延长使用寿命,因此您可以长期坚持退回&String。如果您完全不使用返回值,则get_text的一些用途将使用更短的生命周期。

在这种情况下,因为我们看到,&'a String直接绑在TextEditor值的借&'a self,我们知道,我们只能保持String引用周围最多只要我们能保持TextEditor值的借。

+1

我认为这应该是它自己的博客文章...哇。 – squiguy

5

复述锈代码:

impl<'a> 

“如果你给我一辈子......”(使用类型时,编译器通常提供这种基于上下文)

  Type<'a> { 

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

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

“......并给出参考Type<'a>,你叫my_function()获得终身'au32的参考。”请注意,&self参考的使用期限不直接与'a相关;它可以更短(但通常不会超过'a,因为类型不能超过包含的引用)。

在第二种情况:

impl TextEditor { 

“这是如何实现非终身参数类型TextEditor ...”

pub fn get_text<'a> 

“鉴于一辈子'a您可以从中选择(它是一个输入参数)...“

    (&'a self) 

” ......和一个TextEditor这至少生存'a一个参考。“

       -> &'a String { 

” ......你可以调用get_text方法,并获得借来参考。一个String其生活在同一时间”

更具体而言,这确实意味着,StringTextEditor直接reborrowed - 只要是String参考文件仍然存在,&self借阅被认为仍然有效,您将无法获取任何&mut参考文献。

+0

谢谢,这非常有帮助!我发现我孤立地理解了Rust的大部分概念,但在实践中将它们放在一起时往往很难。将简洁的语法翻译成解释性的散文是了解发生了什么的好方法。我希望阅读代码的例子更多的是:) – dlukes

相关问题