来自 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
之前结束,因为从概念上讲,引用的存在时间不得超过该值。
为什么在此图中,'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
之前结束,因为从概念上讲,引用的存在时间不得超过该值。