开发者社区> 问答> 正文

什么是Rust的变量生命周期规则?

什么是Rust的变量生命周期规则?

展开
收起
张柠檬 2022-05-11 23:19:02 486 0
来自:阿里技术
1 条回答
写回答
取消 提交回答
  • 生命周期检查的主要目标是避免悬垂引用,考虑以下示例 中的程序,它有一个外部作用域和一个内部作用域,外部作用域声明了一个没有初值的变量 r,而内部作用域声明了一个初值为 5 的变量 x。在内部作用域中,我们尝试将 r 的值设置为一个 x 的引用。接着在内部作用域结束后,尝试打印出 r 的值:

    error[E0106]: missing lifetime specifier --> dangle.rs:5:16 | 5 | fn dangle() -> &String { |                ^ expected lifetime parameter | = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from = help: consider giving it a 'static lifetime 当编译这段代码时会得到一个错误:

    error: x does not live long enough | 6  |         r = &x; |              - borrow occurs here 7  |     } |     ^ x dropped here while still borrowed ... 10 | } | - borrowed value needs to live until here 编译错误显示:变量 x 并没有 “活的足够久”,那么Rust是如何判断的呢?

    编译器的这一部分叫做 借用检查器(borrow checker),它比较作用域来确保所有的借用都是有效的。如下:r 和 x 的生命周期注解,分别叫做 'a 和 'b:

    { let r;                // -------+-- 'a //        | {                     //        | let x = 5;        // -+-----+-- 'b r = &x;           //  |     | }                     // -+     | //        | println!("r: {}", r); //        | }                         // -------+ 我们将 r 的生命周期标记为 'a 并将 x 的生命周期标记为 'b。如你所见,内部的 'b 块要比外部的生命周期 'a 小得多。在编译时,Rust 比较这两个生命周期的大小,并发现 r 拥有生命周期 'a,不过它引用了一个拥有生命周期 'b 的对象。程序被拒绝编译,因为生命周期 'b 比生命周期 'a 要小:被引用的对象比它的引用者存在的时间更短。

    关于借用生命周期检查,Rust还有一套复杂的生命周期标记规则,使Rust能在编译时就能发现可能存在的悬垂引用

    2022-05-12 12:30:36
    赞同 展开评论 打赏
问答分类:
问答地址:
来源圈子
更多
收录在圈子:
+ 订阅
问答排行榜
最热
最新

相关电子书

更多
JavaScript 语言在引擎级别的执行过程 立即下载
JS 语言在引擎级别的执行过程 立即下载
用RxSwift写易维护易读的愉悦代码 立即下载