Return 自我生命周期的参考
Return reference with lifetime of self
我想编写如下代码:
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
。
我怎样才能 return 一个与对象本身一样长的引用?
您不希望引用与对象一样长。您只想 a 借用对象(很可能比对象的整个生命周期短),并且您希望生成的引用具有该借用的生命周期。是这样写的:
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
}
我想编写如下代码:
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
。
我怎样才能 return 一个与对象本身一样长的引用?
您不希望引用与对象一样长。您只想 a 借用对象(很可能比对象的整个生命周期短),并且您希望生成的引用具有该借用的生命周期。是这样写的:
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
}