我想写一些如下代码:
struct Foo {
foo: usize
}
impl Foo {
pub fn get_foo<'a>(&'a self) -> &'self usize {
&self.foo
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,失败了invalid lifetime name: 'self is no longer a special lifetime.
如何返回与对象本身一样长的引用?
eul*_*isk 10
在您的示例中,生命周期self是'a这样的,返回引用的生命周期应为'a:
pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器能够在这样的简单情况下推断(生命周期缩减)正确的生命周期,因此您可以避免指定生命周期,这样:
pub fn get_foo(&self) -> &usize {
&self.foo
}
Run Code Online (Sandbox Code Playgroud)
小智 8
您不希望引用与对象完全一样长.你只是想要一个对象(相当比对象的整个生命周期较短的可能)的借位,并且希望得到的参考有借的寿命.这是这样写的:
pub fn get_foo<'a>(&'a self) -> &'a usize {
&self.foo
}
Run Code Online (Sandbox Code Playgroud)
此外,终身省略使签名更漂亮:
pub fn get_foo(&self) -> &usize {
&self.foo
}
Run Code Online (Sandbox Code Playgroud)