跳到主要内容

生命周期

生命周期是 Rust 用来描述引用有效期的一种标注,本质是把"作用域关系"写进类型里。

为什么需要生命周期

当函数返回引用时,编译器需要知道该引用是否一定不超过其来源。多个输入引用之间,需要明确返回的引用与谁绑定,以防悬垂。

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

这里的 'a 表示:返回值的生命周期不会超过 xy 中较短的那一个。

省略规则(Elision)

为减少噪音,编译器在常见模式下会自动推断生命周期:

  • 每个输入引用获得一个独立的生命周期参数。
  • 若只有一个输入引用,该生命周期被赋给所有输出引用。
  • 若方法有 &self&mut self,输出的生命周期默认与 self 一致。

满足这些模式时无需手写标注。

'static 生命周期

'static 表示引用在整个程序运行期间都有效。字符串字面量(如 "hello")的类型就是 &'static str,因为它们被编译进二进制。

结构体中的生命周期

当结构体持有引用时,必须为每个引用字段标注生命周期,以表达"该字段不会比结构体本身活得更久"。

struct Ref<'a> { part: &'a str }

生命周期是泛型的一种,与 T: Trait 一样可以出现在 where 子句中,例如 T: 'a 约束泛型参数至少活得与 'a 一样久。