2.7 理解函数生命周期参数

译文 · 基于 Learning Rust

理解函数生命周期参数

原文链接: https://quinedot.github.io/rust-learning/fn-parameters.html

首先,注意函数签名中被省略的生命周期是函数上不可见的生命周期参数。

1
fn zed(s: &str) {}
1
2
// 等价写法
fn zed<'s>(s: &'s str) {}

当你有这样的生命周期参数时,调用者选择生命周期。但你的函数体对调用者是不透明的:他们只能选择比你的函数体稍长一点的生命周期。

因此,当你的函数上有生命周期参数(且没有进一步约束)时,你唯一知道的是:

  • 它比你的函数体更长
  • 你不能选择它,它可以是任意长的(甚至是 'static)
  • 但它也可能刚好比你的函数体长一点点;你必须同时支持这两种情况

主要推论是:

  • 你不能为调用者选择的生命周期借用局部变量
  • 你不能将调用者选择的生命周期扩展到作用域中的其他命名生命周期
    • 除非有其他 outlives 约束使之成为可能

这里有几个与函数生命周期参数相关的错误示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn long_borrowing_local<'a>(name: &'a str) {
    let local = String::new();
    let borrow: &'a str = &local;
}

fn borrowing_zed(name: &str) -> &str {
    match name.len() {
        0 => "Hello, stranger!",
        _ => &format!("Hello, {name}!"),
    }
}
最后修改 August 23, 2026: 更新 (499855b16)