'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
值的借。
'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