返回具有self生命周期的引用

14

我想写出类似以下的代码:

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

我如何返回一个与对象本身一样长寿的引用?


我的误解是认为赋予一个比输入寿命更长的生命周期是有意义的。但这是不合理的,因为如果我们对 'a 借用了 self,那么我们不能借用 self 的字段超过 'a 的寿命。 - yong
2个回答

20

您不希望引用的生命周期与对象完全相同。 您只需要对对象进行借用(很可能比对象的整个寿命短),并且希望生成的引用具有该借用的生命周期。 写成这样:

pub fn get_foo<'a>(&'a self) -> &'a usize {
    &self.foo
}

此外,生命周期省略使签名更简洁:

pub fn get_foo(&self) -> &usize {
    &self.foo
}

13
在你的示例中,self 的生命周期是 'a,因此返回的引用的生命周期应该是 'a
pub fn get_foo<'a>(&'a self) -> &'a usize {
    &self.foo
}

然而编译器能够推断(生命周期省略)像这样简单的情况下正确的生命周期,所以你可以完全避免指定生命周期,就像这样:

pub fn get_foo(&self) -> &usize {
    &self.foo
}

查看此处以获取生命周期省略规则


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接