我想写出类似以下的代码:
struct Foo {
foo: usize
}
impl Foo {
pub fn get_foo<'a>(&'a self) -> &'self usize {
&self.foo
}
}
但这样行不通,会出现错误:invalid lifetime name: 'self is no longer a special lifetime
。
我如何返回一个与对象本身一样长寿的引用?
您不希望引用的生命周期与对象完全相同。 您只需要对对象进行借用(很可能比对象的整个寿命短),并且希望生成的引用具有该借用的生命周期。 写成这样:
pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
此外,生命周期省略使签名更简洁:
pub fn get_foo(&self) -> &usize {
&self.foo
}
self
的生命周期是 'a
,因此返回的引用的生命周期应该是 'a
:pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
然而编译器能够推断(生命周期省略)像这样简单的情况下正确的生命周期,所以你可以完全避免指定生命周期,就像这样:
pub fn get_foo(&self) -> &usize {
&self.foo
}
'a
借用了self
,那么我们不能借用self
的字段超过'a
的寿命。 - yong