'a 在这两种情况下都是一个生命周期参数。这是一种通用参数,因此每次使用 Type 或每次使用 get_text 都可以为该通用参数选择不同的“值”。程序员从不明确选择实际生命周期,除非您使用 '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的结构定义,我们知道impl块内的'a参数总是等于Type的x字段中引用的生命周期。
返回类型上的那个 -> &'a u32 告诉
接收返回值的变量不应该死
之前……之前什么?在 Type 类型的对象死亡之前?
'a 是存储在 Type<'a> 值中的引用的生命周期,它与 Type 值本身没有其他关系。唯一的规则是 'a 必须比 Type 值本身更长寿,因为它不允许存储超过其生命周期的引用。所以事实上,我们至少可以保留 &'a u32 直到 Type 值消失,甚至更长时间。
impl TextEditor {
//Other methods omitted ...
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
这真的很常见。 &self 是对 self 值的引用——借用——方法 get_text 又是一个通用项。它有一个通用参数——生命周期参数。
它读取,对于任何生命周期'a,借用 self 作为引用 &'a self(该生命周期的引用)并返回对具有相同生命周期的 String 的引用。
在输入 &self 和输出 &String 上使用相同的参数意味着它们是连接的,只要返回的 String 引用是活动的,Rust 就会将 self 视为借用。
同样,方法get_text 是通用的,编译器将为'a 的每次使用选择一个“值”。这是一种可以返回不同长度的字符串借用的方法,具体取决于您允许它借用self 的时间。有时它会选择较长的生命周期,以便您可以长时间保留返回的&String。如果您根本不使用返回值,get_text 的某些用途将使用更短的生命周期。
在这种情况下,由于我们看到 &'a String 直接与 TextEditor 值的借用 &'a self 绑定,我们知道我们最多只能保留 String 引用,只要我们可以持有借用TextEditor 值。