2.5.3 生命周期约束

译文 · 基于 Learning Rust

生命周期约束

原文链接: https://quinedot.github.io/rust-learning/st-bounds.html

下面简要介绍你可能在 fn 声明和 impl 块中见到的生命周期约束。

生命周期之间的约束

'a: 'b 约束大致意味着 'long: 'short。 它常被读作「'a 比 'b 活得久」,有时也称为「outlives 约束」或「outlives 关系」。

我个人也喜欢把它读作「'a 对(至少)'b 有效」。

注意 'a 可以与 'b 相同,尽管有「outlives」这个说法,它不必严格更长。在这方面它类似于 >=。因此在这个例子里:

1
fn example<'a: 'b, 'b: 'a>(a: &'a str, b: &'b str) {}

'a 与 'b 实际上必须是同一生命周期。

当函数参数带有嵌套引用(如 &'b Foo<'a>)时,会推断出 'a: 'b 约束。

(泛型)类型与生命周期之间的约束

T: 'a 表示 &'a T 不会立刻成为未定义行为。换言之,若类型 T 包含任何引用或其他生命周期,它们必须至少与 'a 一样长。

你也可以把这些读作「(类型)T 对 'a 有效」。

注意这与类型 T 的值的生存期范围或 drop 范围无关!这种形式最常见的约束是 T: 'static。

这并不意味着类型 T 的值必须贯穿整个程序!它只是说类型 T 没有非 'static 的生命周期。例如 String: 'static,但这并不意味着你不会 drop String。

可以把 outlives 约束视为递归地、按语法结构适用。例如:

1
2
3
4
5
fn example<'s, 'limit, T>(_s: &'s str, _v: Vec<T>)
where
    // (你通常不会写这样的约束,此处仅为说明:)
    (&'s str, Vec<T>): 'limit,
{}

(&'s str, Vec<T>): 'limit 成立,当且仅当

  1. &'s str: 'limit 成立,当且仅当
    • 's: 'limit 成立
  2. Vec<T>: 'limit 成立,当且仅当
    • T: 'limit 成立

(当你用具体的 T 调用该函数时,这一过程可能继续。)

值的生存期范围

出于上述原因,我倾向于从不把值的生存期或 drop 范围称为该值的「生命周期」。尽管值的生存期范围与指向它的引用的生命周期有关联,混淆这两个概念容易导致困惑。

话虽如此,并非所有人都遵循这一约定,因此你可能仍会看到把值的生存期范围称为该值的「生命周期」。区分这两者,一般值得留意。

Rust 生命周期——那些 'a——与借用的持续时间的关系,远比与某个特定值的作用域紧密。

最后修改 August 23, 2026: 更新 (499855b16)