Avatar ·

什么是 Rust 中的非词法生命周期(non-lexical lifetimes)?

大家好!我最近开始学习 Rust,遇到了生命周期(lifetimes)的概念。我似乎理解了基础知识:编译器检查引用是否悬空,并使用像 `'a` 这样的注解。 但我经常遇到术语“non-lexical lifetimes”(NLL)。老实说,从官方文档中我不完全清楚它们与普通的“词法”生命周期有何不同。我习惯认为变量的生命周期由其作用域决定——即花括号 `{}` 内的块。例如: ```rust fn main() { let r; // ---------+-- 'a { // | let x = 5; // -+-- 'b | r = &x; // | | } // -+ | println!("{}", r); // | } // ---------+ ``` 这里一切都很合理:`r` 引用了 `x`,但 `x` 只存在于块内,因此编译器会报错。这就是词法生命周期。 但那么