新手关于生命周期有一事不解

2021-08-17 18:37:12 +08:00
 leiiiooo

代码如下:

#[derive(Debug)]
struct Point<'x, 'y> {
    x: &'x i32,
    y: &'y i32,
}

fn main() {
    let x = 1;
    let point: Point;
    {
        let y = 2;
        point = Point { x: &x, y: &y };
    }
    print!("{:?}", point);
}

errror message 如下:

error[E0597]: `y` does not live long enough
   --> src/main.rs:224:35
    |
224 |         point = Point { x: &x, y: &y };
    |                                   ^^ borrowed value does not live long enough
225 |     }
    |     - `y` dropped here while still borrowed
226 |     print!("{:?}", point);
    |                    ----- borrow later used here

我对 Point 这个 struct 已经声明了它的两个参数需要使用不同的生命周期,并且我的 main 函数中也模拟了不同的生命周期,编译器提示我无法通过,但是这个错误信息我也看的懂,就是 y 变量的生命周期不够长,但是我还是很好奇我明明声明的字段就是不同的生命周期啊?如果坚持使用引用的话,如何修改可以让代码编译通过?感谢🙏

2028 次点击
所在节点    Rust
9 条回复
Yain
2021-08-17 18:59:27 +08:00
Point 的生命周期以 <'x, 'y> 中最短的为准。

你在 print point 的时候,语义是试图读取已经被析构的 y,自然要报错。

结论:y 在析构的时候 point 已无效。只能将 print 放在上一个作用域内,方能编译。我也是新学,如有不当,请不吝赐教
leiiiooo
2021-08-17 19:22:54 +08:00
@Yain 哈哈,好的,谢谢
libook
2021-08-17 19:43:12 +08:00
编译器说,y 命不够,在第 13 行 block 结束的时候就被 drop 掉了,但后续 print 用到的 point 仍然 borrow 着 y,此时取不到 y 了。

可能是这个意思。
secondwtq
2021-08-17 20:44:43 +08:00
> 如何修改可以让代码编译通过?

命不够长,那当然是续一秒啦

哈哈,今天生日,抖个机灵。

Rust 强调的所谓 memory safety,解决的一个很典型的问题就是 dangling pointer,就是指针指向的对象已经不存在,但是指针还在。解决的方法就是通过 lifetime 分析,禁止 dangling pointer 的出现。也就是说只要你拿到一个 reference,你肯定可以使用它( Rust 也没有 null )。所有可能造成 dangling pointer 的代码都不能编译。就是 y 在最后一个 print 那里的情况。
leiiiooo
2021-08-18 11:06:01 +08:00
@libook 好的,感谢感谢
leiiiooo
2021-08-18 11:06:42 +08:00
@secondwtq 🎂🎂🎂🎂 感谢感谢 我去看看 multiple lifetimes in a struct
leiiiooo
2021-08-18 11:08:07 +08:00
@secondwtq 哈哈,这个我知道,我现在对 multiple lifetimes 还是不太清楚,就是你一个 struct 中为不同的字段定义不同的生命周期标识符~
lance6716
2021-08-18 11:58:48 +08:00
这个报错跟 x,y 生命周期注解关系不大吧,因为 y 活的不够长,你写啥也没用
leiiiooo
2021-08-18 13:54:26 +08:00
@lance6716 嗯 我去了解一下 multiple lifetimes 咋玩

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/796387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX