impl上有三种不同的生命周期说明符:
impl<'a> Type<'a> {
fn my_function(&self) -> &'a u32 {
self.x
}
}
Type<'a>
声明在此impl声明中有生命周期。返回类型-> &'a u32
上的那个表明接收返回值的变量不应该在......之前死掉?在类型Type
的对象死亡之前?
与此有何不同:
impl TextEditor {
//Other methods omitted ...
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
这里说的是返回类型在&'a self
的生命周期结束之前不会死亡。
最后一个是否只声明了这个方法的生命周期,而另一个方法声明了impl声明中每个方法(和关联函数?)的生命周期?
答案 0 :(得分:11)
'a
都是 生命周期参数 。这是一种通用参数,因此每次使用Type
或每次使用get_text
都可以选择不同的&#34;值&#34;对于那个通用参数。除非您使用'static
。
编译器将推断'a
的每个值Type
或get_text
的每次使用应该是impl<'a>
。
impl<'a> Type<'a> { .. }
为整个impl块引入了一个新的生命周期参数。然后在类型中使用它:'a
Type
的确切含义取决于Type
定义中的使用方式。从您的示例中,我猜struct Type<'a> {
x: &'a u32,
}
就是这样:
'a
此定义为:对于每个生命周期x: &'a u32
,定义类型以包含引用Type
。所以impl<'a> Type<'a> { .. }
是通用的,可以存储任何生命周期的引用。
'a
读取:对于每个生命周期Type<'a>
,请为类型Type
定义方法。
由于我们现在知道'a
的结构定义,我们知道impl块中的Type
参数总是等于'a
中的引用的生命周期。 sx field。
返回类型上的那个 - &gt; &amp;&#;; u32告诉我 接收返回值的变量不应该死亡 之前...之前是什么?在Type类型的对象死之前?
Type<'a>
是存储在'a
值内的引用的生命周期,它与Type值本身没有其他关系。唯一的规则是&'a u32
必须比Type值本身更长,因为不允许在其生命周期结束时存储引用。所以事实上,我们可以坚持Type
,直到impl TextEditor {
//Other methods omitted ...
pub fn get_text<'a>(&'a self) -> &'a String {
return &self.text;
}
}
值死亡,甚至更长时间。
&self
这很常见。 get_text
是对自我价值的引用 - 借用 - 方法'a
也是一个通用项目。它有一个通用参数 - 一个生命周期参数。
对于任何生命周期&'a self
,它都会读取self作为引用&self
(该生命周期的引用)并返回对具有相同生命周期的String的引用。
在输入&String
和输出get_text
上使用相同的参数意味着它们已连接,只要返回的String引用处于活动状态,Rust就会将self视为借用。< / p>
同样,方法'a
是通用的,编译器将选择一个&#34;值&#34;对于方法的每次使用,self
。它是一种可以返回String的长期借用的方法,具体取决于您允许它借用&String
的时间长度。有时它会选择较长的生命周期,以便您可以长时间保持返回的get_text
。如果您根本不使用返回的值,&'a String
的某些用法将使用较短的生命周期。
在这种情况下,由于我们发现&'a self
直接与TextEditor
值的借用TextEditor
绑定,因此我们知道我们最多只能将String引用保留为只要我们可以借用includesSubentities
值。
答案 1 :(得分:8)
解释Rust代码:
impl<'a>
“如果你给我一辈子......”(编译器通常在使用类型时根据上下文提供此内容)
Type<'a> {
“......我将介绍如何实施Type<'a>
”。所以Type
可能包含引用(需要一生)。
fn my_function(&self) -> &'a u32 {
“...并且引用了Type<'a>
,您致电my_function()
以获取对u32
生命周期'a
的引用。”请注意,&self
引用的生命周期与'a
没有直接关联;它可以更短(但通常不长于'a
,因为类型不能超过包含的引用。)
在第二种情况下:
impl TextEditor {
“以下是如何实现非生命周期参数类型TextEditor
...”
pub fn get_text<'a>
“给定您可以选择的生命周期'a
(这是输入参数)......”
(&'a self)
“......以及对至少TextEditor
生活的'a
的引用。”
-> &'a String {
“...您可以调用get_text
方法,并获得对同一时间生活的String
的借用引用。”
更实际的说,这实际上意味着String
直接从TextEditor
重新借用 - 只要String
引用存活,&self
借用就是被认为仍处于活跃状态,您将无法接受任何&mut
个引用。