Rust 生命周期
目录
生命周期(Lifetime)标注告诉编译器:引用活多久,从而确保你不会拿一个已经失效的引用。多数时候编译器能自动推导,只有含糊时才需要手写。
为什么需要它
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() { x } else { y }
}编译器不知道返回的引用来自 x 还是 y,也就没法保证它比两者都长寿——会报错,需要显式标注。
生命周期标注
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}<'a> 是生命周期参数,意思是:返回的引用,活得和 x、y 中较短的那个一样久。这只是标注,不改变运行时行为。
结构体中的生命周期
struct Excerpt<'a> {
part: &'a str, // 引用必须标注生命周期
}
impl<'a> Excerpt<'a> {
fn part(&self) -> &str { self.part }
}常见场景
- 函数返回引用时最常遇到。
- 借用检查器(borrow checker)用生命周期验证引用安全。
- 大多数代码用不到手写生命周期,编译器很聪明。
小结
- 生命周期是给编译器的「契约」,不是运行时开销。
- 标注长这样:
&'a str,读作「活过 ‘a 的 str 引用」。 - 真不会写?先让编译器提示,它给的建议通常很准。
➡️ 7. 闭包与迭代器