impl上有三种不同的生命周期说明符:
impl<'a> Type<'a> {
fn my_function(&self) -> &'a u32 {
self.x
}
}
Run Code Online (Sandbox Code Playgroud)
Type<'a>说有这个IMPL声明一生.返回类型-> &'a u32中的那个表明接收返回值的变量不应该在......之前死掉?在类型的对象Type死之前?
有什么不同:
impl TextEditor {
//Other methods omitted ...
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里它表示返回类型在&'a self结束的生命周期之前不会死亡.
最后一个是否只声明了这个方法的生命周期,而另一个方法声明了impl声明中每个方法(和关联函数?)的生命周期?
blu*_*uss 13
'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,
}
Run Code Online (Sandbox Code Playgroud)
该定义如下:对于每个生命周期'a,定义Type以包含引用x: &'a u32.因此Type是通用的,可以存储任何生命周期的引用.
impl<'a> Type<'a> { .. }读取:对于每个生命周期'a,定义类型的方法Type<'a>.
由于我们现在知道结构定义Type,我们知道'aimpl块内的参数总是等于Type'sx字段中引用的生命周期.
返回类型中的一个 - >&'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;
}
}
Run Code Online (Sandbox Code Playgroud)
这很常见.&self是对自我价值的引用 - 借用 - 而且该方法get_text也是一个通用项目.它有一个通用参数 - 一个生命周期参数.
它读取,在任何生命周期中'a,借用self作为引用&'a self(该生命周期的引用)并返回对具有相同生命周期的String的引用.
在输入&self和输出上使用相同的参数&String意味着它们是连接的,只要返回的String引用是活动的,Rust就会将self视为借用.
同样,该方法get_text是通用的,编译器将为'a每次使用该方法选择一个"值" .这是一种方法,可以返回String的各种长期借用,具体取决于您允许借用的时间长度self.有时它会选择很长的使用寿命,因此您可以长时间保持返回&String状态.get_text如果您根本不使用返回值,则某些用途将使用较短的生命周期.
在这种情况下,由于我们看到它&'a String直接与值的借用相关&'a self联TextEditor,我们知道只要我们可以借用该值,我们只能保留String引用TextEditor.
解释Rust代码:
impl<'a>
Run Code Online (Sandbox Code Playgroud)
"如果你给我一辈子......"(编译器通常在使用类型时根据上下文提供)
Type<'a> {
Run Code Online (Sandbox Code Playgroud)
"......我将描述如何实施Type<'a>".所以Type可能包含引用(需要一生).
fn my_function(&self) -> &'a u32 {
Run Code Online (Sandbox Code Playgroud)
"......并且给出了一个参考Type<'a>,你打电话my_function()来获得一个u32有生命周期的参考'a." 请注意,&self引用的生命周期并不直接关联'a; 它可以更短(但通常不长于'a,因为类型不能超过包含的引用).
在第二种情况:
impl TextEditor {
Run Code Online (Sandbox Code Playgroud)
"这是如何实现非寿命参数类型TextEditor......"
pub fn get_text<'a>
Run Code Online (Sandbox Code Playgroud)
"给定一个'a你可以选择的生命周期(它是一个输入参数)......"
(&'a self)
Run Code Online (Sandbox Code Playgroud)
"......并提到TextEditor至少生活在'a......"
-> &'a String {
Run Code Online (Sandbox Code Playgroud)
"......你可以打电话给这个get_text方法并获得一个借用的参考文献,这个参考文献String同时存在."
从更实际的角度来说,这实际上意味着String直接重新借用TextEditor- 只要该String引用存活,&self借用被认为仍然是活跃的,您将无法接受任何&mut引用.