IB-Rust-生命周期
创建生命周期
⽣命周期主要通过⽣命周期注解来创建和使⽤。⽣命周期注解是⼀种显式声明引⽤有效时间的⽅式,通常⽤’a、’b 这样的符号表示
生命周期类别
fn
‘a ⽣命周期注解 表明返回值的⽣命周期与输⼊参数的⽣命周期相同:
1 | fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { |
struct
1 | struct Example<'a> { |
enum
1 | enum StringOption<'a> { |
生命周期消除(Lifetime Elision)
rust 编译期自动推理,无需手动重复添加
- 每个引⽤参数都有⾃⼰的⽣命周期参数
- 如果只有⼀个输⼊引⽤参数,那么它的⽣命周期会被赋予所有输出引⽤
- 如果有多个输⼊⽣命周期参数,但其中⼀个是
&self或&mut self,那么self的⽣命周期会被赋予所有输出引⽤
1 | fn _first_word(s: &str) -> &str { |
特殊生命周期标注
'static ⽣命周期表示整个程序运⾏期间都有效的⽣命周期,通常⽤于全局变量或字符串字⾯量
1 | let s: &'static str = "hello"; |
生命周期约束
生命周期注解可以用来约束多个引用之间的关系
‘b: ‘a 表示⽣命周期’b 必须不短于’a:
1 | fn example<'a, 'b>(x: &'a str, y: &'b str) -> &'a str |
⽣命周期⼦类型和协变
⽣命周期可以有⼦类型关系,较短的⽣命周期可以被视为较⻓⽣命周期的⼦类型。这在协变(convariance)中尤为重要
1 | fn _example1<'a, 'b>(x: &'a str, y: &'b str) -> &'a str |
课后习题
修改如下代码,使得编译通过,并解释为什么?
进阶: 还有⼏种解法可以实现,你能通过修改⼀个⽣命周期参数实现吗?
1 | fn test_lifetime_multiple() { |
解决方法:
&'a mut Vec<&'a i32> 是错误的,my_vec 和 其中存储的元素引用 的生命周期不能相同,因为有如下冲突:
- 第一次调用后,向量要求所有元素具有生命周期’α1
- 但第二次调用要求元素具有生命周期’α2
- ‘α1和’α2是不同的具体生命周期实例
- 向量不能存储具有不同生命周期的引用
1 | let a = &mut my_vec; // [1] 借用开始,设为生命周期'α1 |
正确代码:
1 | fn _test_lifetime_multiple() { |
- Title: IB-Rust-生命周期
- Author: Gabrielle
- Created at : 2025-06-05 23:40:26
- Updated at : 2025-06-09 14:38:22
- Link: https://zoella-w.github.io/2025/06/05/76-IB-Rust-生命周期/
- License: This work is licensed under CC BY-NC-SA 4.0.