'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
,定义Type包含一个引用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 {
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
这是很常见的。 &self
是指向 self 值(一种借用)的引用,方法 get_text
再次是一个通用类型。它有一个通用参数 - 生命周期参数。
它表示,对于任何生命周期'a
,将self作为引用&'a self
(该生命周期的引用)进行借用,并返回一个与相同生命周期的字符串的引用。
在输入&self
和输出&String
都使用了相同的参数,这意味着它们是连接在一起的,只要返回的字符串引用存在,Rust就会将self视为被借用的状态。
同样,方法get_text
是通用的,编译器将为每个方法的使用选择一个“值”'a
。它是一种可以返回字符串的不同长时间借用的方法,具体取决于您允许其借用self的时间有多长。有时它会选择一个长的生命周期,以便您可以长时间保留返回值&String
。如果您根本不使用返回值,那么某些get_text
的用法将使用较短的生命周期。
在这种情况下,由于我们看到&'a String
直接绑定在TextEditor
值的借用&'a self
上,我们知道我们最多只能保留字符串引用和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