# Rust 生命周期

生命周期（Lifetime）标注告诉编译器：**引用活多久**，从而确保你不会拿一个已经失效的引用。多数时候编译器能自动推导，只有含糊时才需要手写。

## 为什么需要它

```rust
fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() { x } else { y }
}
```

编译器不知道返回的引用来自 `x` 还是 `y`，也就没法保证它比两者都长寿——会报错，需要显式标注。

## 生命周期标注

```rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}
```

`<'a>` 是生命周期参数，意思是：返回的引用，活得和 `x`、`y` 中**较短**的那个一样久。这只是标注，不改变运行时行为。

## 结构体中的生命周期

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

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

## 常见场景

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

## 小结

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

➡️ [7. 闭包与迭代器](rust-07-closures-iterators.md)

