我想写一些如下代码:
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
。
如何返回与对象本身一样长的引用?
答案 0 :(得分:10)
在您的示例中,self
的生命周期为'a
,因此返回引用的生命周期应为'a
:
pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
然而,在这种简单的情况下,编译器能够推断(生命周期省略)正确的生命周期,因此您可以避免指定生命周期,这样:
pub fn get_foo(&self) -> &usize {
&self.foo
}
答案 1 :(得分:8)
您不希望引用与对象完全一样长。您只需要 a 借用对象(很可能比对象的整个生命周期短),并且您希望结果引用具有该借用的生命周期。那是这样写的:
pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
此外,终身省略使签名更漂亮:
pub fn get_foo(&self) -> &usize {
&self.foo
}