
生命周期(lifetime)是 Rust 用来在编译期证明“引用始终有效”的标注系统。它不改变运行时行为,但指导编译器确认:任何引用的生存期都不短于其使用范围,从而杜绝悬垂引用。
本篇将系统讲解生命周期的直觉、语法、推断规则、常见场景(函数、方法、结构体、枚举、闭包)、以及典型报错的修复方式。
'a, 'b 等是“生命周期参数”。'a: 'b 表示 'a 的生存期不短于 'b。当函数返回引用时,编译器需要知道:返回的引用与哪个输入引用的生命周期相关。
// 返回两个字符串切片中较长的那个
fn longer<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() >= y.len() { x } else { y }
}
fn main() {
let s1 = String::from("abcd");
let s2 = String::from("xyz");
let r = longer(s1.as_str(), s2.as_str());
println!("{r}");
}
要点:返回值的生命周期 'a 与两个输入引用的最短有效期绑定,因此调用方必须保证二者在使用 r 期间都有效。
很多时候无需显式标注,编译器应用三条省略规则:
&self 或 &mut self,则输出引用的生命周期与接收者一致。因此如下函数无需手写参数:
fn first<'a>(s: &'a str) -> &'a str { &s[..1] }
// 等价于
fn first_auto(s: &str) -> &str { &s[..1] }结构体若持有引用,则必须为引用字段标注生命周期,并把该参数带到 impl 块:
struct Line<'a> { head: &'a str, tail: &'a str }
impl<'a> Line<'a> {
fn head(&self) -> &str { self.head }
}结构体的实例有效性受其引用字段的最短生命周期约束。
enum Either<'a> { L(&'a str), R(&'a str) }
impl<'a> Either<'a> {
fn as_str(&self) -> &str {
match self { Either::L(s) | Either::R(s) => s }
}
}生命周期大多可因省略规则自动推断。只有当返回多个源于不同借用的引用时,才需要显式标注。
struct Pair<'a> { left: &'a str, right: &'a str }
impl<'a> Pair<'a> {
fn left(&self) -> &str { self.left } // 省略规则3生效
fn right(&self) -> &str { self.right }
}fn pick<'a, T>(a: &'a T, b: &'a T) -> &'a T where T: std::fmt::Debug {
if format!("{:?}", a).len() >= format!("{:?}", b).len() { a } else { b }
}'static'static 表示“程序全生命周期”。"hello" 的类型是 &'static str。'static 通常是不安全或需要所有权转移(例如把数据放进全局单例)。谨慎使用。static APP_NAME: &str = "MyApp"; // &'static str示例:
fn broken<'a>(x: &'a String) -> &'a str {
let tmp = String::from("hi");
// &tmp 仅在此作用域有效,不能返回
// &tmp[..]
x.as_str() // 返回与输入相关联的引用才安全
}闭包捕获的引用同样受借用与生命周期规则约束:
fn with_prefix<'a>(p: &'a str) -> impl Fn(&'a str) -> String {
move |s: &'a str| format!("{}{}", p, s)
}若闭包跨线程使用,需考虑 'static 约束以及 Send/Sync 辅助 trait。
String、Vec<T>),在不影响性能时可减少生命周期标注负担。&[T]/&str,提升通用性并便于推断。longest<'a>(a: &'a str, b: &'a str) -> &'a str,并写出最小测试用例。Spans<'a>,实现方法 mid(&self) -> &'a str 返回中间一段。String 的切片作为返回值,观察并解释编译错误。至此,你已掌握生命周期的核心用法。下一篇将结合所有权/借用/生命周期,走进更贴近业务的“字符串与集合的所有权模型实践”。