来自 The Rust Programming Language 关于生命周期的问题

Question about lifetimes from The Rust Programming Language

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

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

这里,生命周期 'a'b 都在花括号的末尾结束。它们都是在同一范围内创建和销毁的,因为它们都没有移动,所以在这种情况下你是正确的。为了我们的目的,它们同时结束。然而,'a 显示在 'b 之前结束的原因与 Rust 借用检查器如何处理引用有关,并在下面解释 Listing 10-18 of the same Rust Programming Language book:

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

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

The program is rejected because 'b is shorter than 'a: the subject of the reference doesn’t live as long as the reference.

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

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

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