首页 > 解决方案 > Rust 编程语言中关于生命周期的问题

问题描述

为什么在此图中 'a 在 'b 之前结束?他们不应该在花括号的末尾同时结束吗?

在此处输入图像描述

这是“The Rust Programming Language”一书中的清单 10-19 ( https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html )

标签: rustlifetime

解决方案


在这里,生命周期'a'bdo 都在花括号的末尾结束。它们都是在同一范围内创建和销毁的,因为它们都没有被移动,所以在这种情况下你是正确的。出于我们的目的,它们同时结束。但是,'a显示结束之前的原因'b与 Rust 借用检查器如何处理引用有关,并在同一本 Rust 编程语言书的清单 10-18中进行了解释:

// Listing 10-18
{
    let r;                // ---------+-- 'a
                          //          |
    {                     //          |
        let x = 5;        // -+-- 'b  |
        r = &x;           //  |       |
    }                     // -+       |
                          //          |
    println!("r: {}", r); //          |
}                         // ---------+

Rust 借用检查器拒绝上述代码段,因为引用&x比值x本身寿命长,这会导致问题。书中将其解释为:

程序被拒绝,因为 'b 比 'a 短:参考的主题没有参考的寿命。

这个很重要。牢记这个概念,让我们再次阅读您的代码段:

// Listing 10-19
{
    let x = 5;            // ----------+-- 'b
                          //           |
    let r = &x;           // --+-- 'a  |
                          //   |       |
    println!("r: {}", r); //   |       |
                          // --+       |
}                         // ----------+

借用检查器必须能够保证引用不会超过它所引用的值。因此,引用的生命周期必须比值本身的生命周期短。在您的代码片段中,引用的生命周期'a显示为在值的生命周期之前结束,'b因为从概念上讲,引用的存在时间不得长于值。


推荐阅读