代码如下:
#[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 活的不够长,你写啥也没用
|