'a
在这两种情况下都是lifetime parameter.这是一种通用参数,所以每次使用Type
或get_text
都可以为该通用参数 Select 不同的"值".程序员永远不会明确 Select 实际的生命周期,除非使用'static
.
编译器将为Type
的每个值或get_text
的每个使用推断'a
应该是多少.
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
的 struct 定义,我们知道impl块中的'a
参数始终等于Type
的x字段中引用的生存期.
The one on the return type -> &'a u32 tells that the
variable which is receiving the return value should not die
before...before what? Before the object of type Type dies?
'a
是存储在值Type<'a>
中的引用的生存期,它与类型值本身没有其他关系.唯一的规则是'a
必须比类型值本身更长寿,因为不允许它存储超过其生命周期 的引用.所以事实上,我们可以保持&'a u32
,直到Type
的值消失,甚至更长.
impl TextEditor {
//Other methods omitted ...
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
这很常见.&self
是对self 价值的引用——borrow ——方法get_text
也是一个通用项.它有一个通用参数——生存期参数.
它读取,对于任何生存期'a
,borrow self作为引用&'a self
(该生存期的引用),并返回对具有相同生存期的字符串的引用.
在输入&self
和输出&String
上使用相同的参数意味着它们是连接的,只要返回的字符串引用是活动的,Rust就会将self视为borrow 的.
同样,方法get_text
是泛型的,编译器将为方法的每次使用 Select 'a
的"值".这是一种可以返回不同长度的字符串borrow 的方法,具体取决于允许它borrow 的时间.有时,它会 Select 一个较长的生命周期,这样你就可以长时间地坚持下go .如果不使用返回值,get_text
的某些用法将使用更短的生存期.
在本例中,由于我们看到&'a String
直接绑定到TextEditor
值的借阅&'a self
,我们知道,只要我们能保持TextEditor
值的借阅,我们最多只能保持字符串引用.