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