结论:NLL(Non-Lexical Lifetimes)指借用的有效期不再由花括号界定的词法作用域决定,而是由借用"最后一次被使用"的位置决定——从借用产生到最后一次使用之间才算活着,之后即自动结束。
展开:在 NLL(Rust 2018 起默认)之前,借用的生命周期延伸到词法作用域末尾,导致大量明明安全的代码被误拒,比如先用完一个 &mut 再声明新借用、或在 match 分支里提前结束借用。NLL 让借用检查基于控制流图:只要两个借用在使用时间上不重叠,即使词法上嵌套也合法。注意:NLL 没有放松规则,只是让检查更精确——同时活跃的两个可变借用依然报错。易错点:if let Some(x) = map.get_mut(&k) 之后再 map.insert(k, v) 仍可能被拒,需用 entry API 或重构。追问方向:NLL 对函数签名中的生命周期标注有影响吗?没有,标注规则不变。
let mut v = vec![1, 2, 3];
let first = &v[0]; // 不可变借用
println!("{first}"); // 最后一次使用,借用在此结束
v.push(4); // NLL 下合法:可变借用不与其重叠