V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leiiiooo
V2EX  ›  Rust

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

  •  
  •   leiiiooo · 2021-08-17 18:37:12 +08:00 · 2074 次点击
    这是一个创建于 1227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    #[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 条附言  ·  2021-08-18 19:06:04 +08:00
    第 2 条附言  ·  2021-08-18 19:22:18 +08:00
    9 条回复    2021-08-18 13:54:26 +08:00
    Yain
        1
    Yain  
       2021-08-17 18:59:27 +08:00
    Point 的生命周期以 <'x, 'y> 中最短的为准。

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

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

    可能是这个意思。
    secondwtq
        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 那里的情况。
    leiiiooo
        5
    leiiiooo  
    OP
       2021-08-18 11:06:01 +08:00
    @libook 好的,感谢感谢
    leiiiooo
        6
    leiiiooo  
    OP
       2021-08-18 11:06:42 +08:00
    @secondwtq 🎂🎂🎂🎂 感谢感谢 我去看看 multiple lifetimes in a struct
    leiiiooo
        7
    leiiiooo  
    OP
       2021-08-18 11:08:07 +08:00
    @secondwtq 哈哈,这个我知道,我现在对 multiple lifetimes 还是不太清楚,就是你一个 struct 中为不同的字段定义不同的生命周期标识符~
    lance6716
        8
    lance6716  
       2021-08-18 11:58:48 +08:00 via Android
    这个报错跟 x,y 生命周期注解关系不大吧,因为 y 活的不够长,你写啥也没用
    leiiiooo
        9
    leiiiooo  
    OP
       2021-08-18 13:54:26 +08:00
    @lance6716 嗯 我去了解一下 multiple lifetimes 咋玩
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.