
代码如下:
#[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 变量的生命周期不够长,但是我还是很好奇我明明声明的字段就是不同的生命周期啊?如果坚持使用引用的话,如何修改可以让代码编译通过?感谢
1 Yain 2021-08-17 18:59:27 +08:00 Point 的生命周期以 <'x, 'y> 中最短的为准。 你在 print point 的时候,语义是试图读取已经被析构的 y,自然要报错。 结论:y 在析构的时候 point 已无效。只能将 print 放在上一个作用域内,方能编译。我也是新学,如有不当,请不吝赐教 |
3 libook 2021-08-17 19:43:12 +08:00 编译器说,y 命不够,在第 13 行 block 结束的时候就被 drop 掉了,但后续 print 用到的 point 仍然 borrow 着 y,此时取不到 y 了。 可能是这个意思。 |
4 secondwtq 2021-08-17 20:44:43 +08:00 > 如何修改可以让代码编译通过? 命不够长,那当然是续一秒啦 哈哈,今天生日,抖个机灵。 Rust 强调的所谓 memory safety,解决的一个很典型的问题就是 dangling pointer,就是指针指向的对象已经不存在,但是指针还在。解决的方法就是通过 lifetime 分析,禁止 dangling pointer 的出现。也就是说只要你拿到一个 reference,你肯定可以使用它( Rust 也没有 null )。所有可能造成 dangling pointer 的代码都不能编译。就是 y 在最后一个 print 那里的情况。 |
7 leiiiooo OP @secondwtq 哈哈,这个我知道,我现在对 multiple lifetimes 还是不太清楚,就是你一个 struct 中为不同的字段定义不同的生命周期标识符~ |
8 lance6716 2021-08-18 11:58:48 +08:00 via Android 这个报错跟 x,y 生命周期注解关系不大吧,因为 y 活的不够长,你写啥也没用 |