目录

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> 是生命周期参数,意思是:返回的引用,活得和 xy较短的那个一样久。这只是标注,不改变运行时行为。

结构体中的生命周期

struct Excerpt<'a> {
    part: &'a str, // 引用必须标注生命周期
}

impl<'a> Excerpt<'a> {
    fn part(&self) -> &str { self.part }
}

常见场景

  • 函数返回引用时最常遇到。
  • 借用检查器(borrow checker)用生命周期验证引用安全。
  • 大多数代码用不到手写生命周期,编译器很聪明。

小结

  • 生命周期是给编译器的「契约」,不是运行时开销。
  • 标注长这样:&'a str,读作「活过 ‘a 的 str 引用」。
  • 真不会写?先让编译器提示,它给的建议通常很准。

➡️ 7. 闭包与迭代器