< 返回版块

axzsd 发表于 2020-12-15 14:41

Tags:lifetime

struct TestBox<'a>(&'a i32);

impl <'a> TestBox <'a> {
    fn get_a(&self) -> &i32 {
        self.0
    }
}

这里&self的生命周期是'a吗?还是临时的生命周期?

评论区

写评论
作者 axzsd 2020-12-30 16:21

谢谢

--
👇
yez730: 想表达的是返回的引用和TestBox里的引用生命周期一样,但生命周期省略规则默认成返回的引用和TestBox引用本身生命周期一样了,等价于:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'b i32 {
        self.0
    }
}

正确的应该是:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'a i32 {
        self.0
    }
}

参考下这个:https://github.com/pretzelhammer/rust-blog/blob/master/posts/common-rust-lifetime-misconceptions.md

👇
minstrel1977: 强行答一下,算是抛砖引玉: fn get_a(&self) -> &i32 { 中的&self等价于 self: &'a Self 所以&self的生命周期参数是'a

作者 axzsd 2020-12-30 16:19

谢谢大哥们的回答

lithbitren 2020-12-18 17:07

学习了,发现这个文章还有中文翻译,受益匪浅 https://github.com/pretzelhammer/rust-blog/blob/master/posts/translations/zh-hans/common-rust-lifetime-misconceptions.md

--
👇
yez730: 想表达的是返回的引用和TestBox里的引用生命周期一样,但生命周期省略规则默认成返回的引用和TestBox引用本身生命周期一样了,等价于:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'b i32 {
        self.0
    }
}

正确的应该是:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'a i32 {
        self.0
    }
}

参考下这个:https://github.com/pretzelhammer/rust-blog/blob/master/posts/common-rust-lifetime-misconceptions.md

👇
minstrel1977: 强行答一下,算是抛砖引玉: fn get_a(&self) -> &i32 { 中的&self等价于 self: &'a Self 所以&self的生命周期参数是'a

yez730 2020-12-17 09:31

想表达的是返回的引用和TestBox里的引用生命周期一样,但生命周期省略规则默认成返回的引用和TestBox引用本身生命周期一样了,等价于:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'b i32 {
        self.0
    }
}

正确的应该是:

impl <'a> TestBox <'a> {
    fn get_a<'b>(&'b self) -> &'a i32 {
        self.0
    }
}

参考下这个:https://github.com/pretzelhammer/rust-blog/blob/master/posts/common-rust-lifetime-misconceptions.md

👇
minstrel1977: 强行答一下,算是抛砖引玉: fn get_a(&self) -> &i32 { 中的&self等价于 self: &'a Self 所以&self的生命周期参数是'a

jy00464346 2020-12-16 22:09

是的。 这里应该是遵循的生命周期省略规则(lifetime elision rules)的第三条 3. 第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self 或 &mut self,说明是个对象的方法(method)(译者注: 这里涉及rust的面向对象参见17章), 那么所有输出生命周期参数被赋予 self的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。

minstrel1977 2020-12-15 22:51

强行答一下,算是抛砖引玉: fn get_a(&self) -> &i32 { 中的&self等价于 self: &'a Self 所以&self的生命周期参数是'a

Nalleyer 2020-12-15 20:44

我理解是的 (等楼下其他大佬打脸)

1 共 7 条评论, 1 页