返回自我生命周期的参考

时间:2015-07-26 20:27:22

标签: rust lifetime

我想写一些如下代码:

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

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

2 个答案:

答案 0 :(得分:10)

在您的示例中,self的生命周期为'a,因此返回引用的生命周期应为'a

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

然而,在这种简单的情况下,编译器能够推断(生命周期省略)正确的生命周期,因此您可以避免指定生命周期,这样:

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

Look here for lifetime elision rules

答案 1 :(得分:8)

您不希望引用与对象完全一样长。您只需要 a 借用对象(很可能比对象的整个生命周期短),并且您希望结果引用具有该借用的生命周期。那是这样写的:

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

此外,终身省略使签名更漂亮:

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