结论:生命周期标注不改变任何值的实际存活时间,它只是向编译器"声明引用之间的存活关系",让借用检查器能在函数边界(不看函数体实现)分别验证调用方与实现方各自安全——本质是函数契约的一部分。

展开:编译器对函数是分开检查的:签名中的 'a 建立"输入引用"与"输出引用"的关联,例如 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str 表示返回值活得不超过两个输入中较短的那个;调用处据此取交集验证,实现处据此拒绝返回局部变量。易错点:①标注必须反映真实来源,写错(返回引用实际来自 y 却只关联 x)照样编译失败;②'a 表示"至少这么久的某个范围",不是具体值;③给所有引用都标同一个 'a 会过度约束调用方,能用省略就用省略。追问方向:哪些场景必须手写标注?多个输入引用且返回引用、结构体持有引用、需要区分多个输入来源时。

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}
let s1 = String::from("long");
let r;
{
    let s2 = String::from("s");
    r = longest(&s1, &s2);
    println!("{r}"); // OK:r 不超过 s2 的生命周期
}                    // s2 离开作用域后 r 不可再用