生命周期
生命周期是 Rust 用来描述引用有效期的一种标注,本质是把"作用域关系"写进类型里。
为什么需要生命周期
当函数返回引用时,编译器需要知道该引用是否一定不超过其来源。多个输入引用之间,需要明确返回的引用与谁绑定,以防悬垂。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
这里的 'a 表示:返回值的生命周期不会超过 x 与 y 中较短的那一个。
省略规则(Elision)
为减少噪音,编译器在常见模式下会自动推断生命周期:
- 每个输入引用获得一个独立的生命周期参数。
- 若只有一个输入引用,该生命周期被赋给所有输出引用。
- 若方法有
&self或&mut self,输出的生命周期默认与self一致。
满足这些模式时无需手写标注。
'static 生命周期
'static 表示引用在整个程序运行期间都有效。字符串字面量(如 "hello")的类型就是 &'static str,因为它们被编译进二进制。
结构体中的生命周期
当结构体持有引用时,必须为每个引用字段标注生命周期,以表达"该字段不会比结构体本身活得更久"。
struct Ref<'a> { part: &'a str }
生命周期是泛型的一种,与 T: Trait 一样可以出现在 where 子句中,例如 T: 'a 约束泛型参数至少活得与 'a 一样久。