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

看了几天 rust, 总结了一句话关于生命周期

  •  1
     
  •   iorilu · 352 天前 via Android · 4912 次点击
    这是一个创建于 352 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这个生命周期概念确实是 rust 独有

    虽然这个理论并不新鲜, 但 rust 是强制,作为程序员必须明确知道所有变量或对象的生命周期,而不是靠编译器或语言自己推理

    我总就一句话就是

    这里我指一个复杂对象,里面可以有对别的对象引用

    借我钱意思是引用我

    我借别人钱意思是引用别人

    所有借我钱的必须死我前面,这样我就能收回所有借出的钱

    但我借别人钱我得死别人前面,这样就不用还钱

    这样才能利益最大化啊。。
    25 条回复    2023-05-08 10:45:11 +08:00
    Tanix2
        1
    Tanix2  
       352 天前
    就是要保证不会有空引用
    aijam
        2
    aijam  
       352 天前   ❤️ 19
    你到底说了几句话
    misaka
        3
    misaka  
       352 天前 via iPhone   ❤️ 1
    你这一句话好长啊
    adoal
        4
    adoal  
       352 天前   ❤️ 1
    只听田七嘶声道:“李寻欢,你好长的气”
    Mohanson
        5
    Mohanson  
       352 天前
    RAII 好像不是 Rust 独有的, 但强制使用 RAII 应该是独一家?
    zeal7s
        6
    zeal7s  
       352 天前
    啊?没有垃圾回收的语言都有生命周期吧,无非就是需要开发者自己维护,否则就是空异常
    xtreme1
        7
    xtreme1  
       352 天前
    rustc 其实在相当多情况是帮你推理了生命周期的
    如果意识不到这一点, 可以找个早期版本写一写
    TWorldIsNButThis
        8
    TWorldIsNButThis  
       352 天前 via iPhone   ❤️ 1
    是生存期 lifetime
    不是生命周期 lifecycle
    一个变量死了以后不会复活
    gant
        9
    gant  
       352 天前 via Android
    利益最大化?没了诚信你怎么利益最大化?你的的诚信一文不值?阴曹地府不讲诚信?判官让你投猪胎。
    alne
        10
    alne  
       352 天前
    重新定义一句话
    vituralfuture
        11
    vituralfuture  
       352 天前
    我觉得应该是类似一个有向树,就像软件的依赖一样,一个高级的对象引用了一些中级的对象,中级的对象引用了一些低级的对象,就像包管理器不能卸载一个被其他软件依赖的软件,要卸载软件,或者说要解除引用,应该先从最顶层开始

    当然我并没有学过 rust ,只是个人理解
    zhez
        12
    zhez  
       352 天前
    关于“借”,更应该写明“借出”和“借入”或“借给我”和“我借给”
    e7
        13
    e7  
       352 天前
    领导说“下面我简单说两句”,我们都错怪他了,确实只说了两句
    iorilu
        14
    iorilu  
    OP
       352 天前
    @zhez 确实, 应该更明确点

    借我钱意思是引用我 => 别人找我借钱(我借出)意思是引用我

    我借别人钱意思是引用别人 => 我找别人借钱(我借入)意思是我引用别人
    chtcrack
        15
    chtcrack  
       352 天前
    这么简单的问题,为什么要搞那么复杂?,你申请了一块内存来用,不用的时候记得回收,就这样而已..
    搞得花里胡哨没有一点意义..
    MrHyde
        16
    MrHyde  
       352 天前   ❤️ 1
    循环引用怎么办?
    Jirajine
        17
    Jirajine  
       352 天前
    用 RUST 最顺手的地方不是生命周期,而是和类型、强类型约束的错误处理。
    defage
        18
    defage  
       352 天前   ❤️ 1
    就是原来 C++编译器要干的事现在让程序员干大头了(^_^)
    lmshl
        19
    lmshl  
       352 天前
    你总结的不行,听我的一句话总结:
    Rust Ownership 的设计目的只有一个,就是应该将 drop() 插入到哪个位置。
    liuguang
        20
    liuguang  
       352 天前
    简而言之,rust 中的引用必须保证引用的内存有效,不能出现无效引用。
    在 C/C++,如果你的结构体字段是一个指针,但是指针指向的内存可能早就已经释放了,这时候读写这块内存,就是内存安全问题。
    在 rust 语言中,一个结构体的字段如果是引用,就必须保证这个结构体的对象存在时,字段的引用必须有效。
    这个要经过编译器检查的,也就是说,能编译通过的 rust 程序,就不会出现上面说的无效引用,不会出现这种内存安全问题。
    而且也并不是函数中有引用,就需要标注生命周期。只有函数的输入输出都有引用时,才需要标注生命周期。
    而且有三种范式是比较常见的,可以省略标注,因为编译器能理解,其他情况才需要去标注。
    liuguang
        21
    liuguang  
       352 天前
    别人借我钱,别人必须活的比我长。如果别人先死了,我持有的借用就无效了。
    我借别人钱,我必须活的比别人长。如果我先死了,别人持有的借用就无效了。
    这两个是一样的! A 借钱给 B ,那么 A 的生命周期>=B 的生命周期。
    一个结构体的字段如果持有三个引用,那么这个结构体的生命周期<=生命周期最短的那个。这应该很好理解吧。
    815979670
        22
    815979670  
       352 天前
    进程不是也是这个概念,父进程 必须比子进程活得长,子进程必须在父进程关闭之前结束掉(如果没结束也会自动结束)
    fengjianxinghun
        23
    fengjianxinghun  
       351 天前
    @Jirajine 类型系统比它强的多的是,其实好的部分就是 cargo 和 Resut/Option
    lynnharry
        24
    lynnharry  
       351 天前
    @TWorldIsNButThis
    程序再次跑到这里的时候,就复活了吧?我还见过的:
    https://developer.android.com/guide/fragments/lifecycle
    gp3098
        25
    gp3098  
       347 天前 via Android
    我来我来
    出来混,迟早要还的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1677 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:42 · PVG 00:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.