## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 显式注解

借用检查器使用显式生命周期注解来确定引用应该有效多长时间。在生命周期没有被省略1的情况下，Rust 需要显式注解来确定引用的生命周期。显式注解生命周期的语法使用撇号字符，如下所示：

    foo<'a>
    // `foo` 有一个生命周期参数 `'a`

类似于闭包，使用生命周期需要泛型。此外，这种生命周期语法表示 `foo` 的生命周期不能超过 `'a` 的生命周期。类型的显式注解形式为 `&'a T`，其中 `'a` 已经被引入。

在有多个生命周期的情况下，语法类似：

    foo<'a, 'b>
    // `foo` 有生命周期参数 `'a` 和 `'b`

在这种情况下，`foo` 的生命周期不能超过 `'a` 或 `'b` 的生命周期。

请看下面的例子，展示了显式生命周期注解的使用：

    // `print_refs` 接受两个 `i32` 的引用，它们有不同的
    // 生命周期 `'a` 和 `'b`。这两个生命周期都必须
    // 至少和函数 `print_refs` 一样长。
    fn print_refs<'a, 'b>(x: &'a i32, y: &'b i32) {
        println!("x 是 {}，y 是 {}", x, y);
    }

    // 一个没有参数但有生命周期参数 `'a` 的函数。
    fn failed_borrow<'a>() {
        let _x = 12;

        // 错误：`_x` 的生命周期不够长
        let _y: &'a i32 = &_x;
        // 尝试在函数内部使用生命周期 `'a` 作为显式类型标注会失败，
        // 因为 `&_x` 的生命周期比 `_y` 的短。
        // 短生命周期无法强制转换为长生命周期。
    }

    fn main() {
        // 创建将要被借用的变量。
        let (four, nine) = (4, 9);

        // 将两个变量的借用（`&`）传递给函数。
        print_refs(&four, &nine);
        // 任何被借用的输入必须比借用者存活更久。
        // 换句话说，`four` 和 `nine` 的生命周期必须
        // 比 `print_refs` 的生命周期更长。

        failed_borrow();
        // `failed_borrow` 不包含任何引用来强制 `'a` 比函数的生命周期更长，
        // 但 `'a` 实际上更长。
        // 因为生命周期从未被约束，它默认为 `'static`。
    }

### 另请参阅：

泛型（generics）和闭包（closures）

1. 省略（elision）隐式地注解生命周期，因此与显式注解不同。 ↩