生命周期进阶
学习目标
- 理解生命周期省略规则细节
- 掌握高阶 trait bound (HRTB)
- 理解生命周期子类型
核心概念
省略规则详解
// 规则 1:每个引用参数有自己的生命周期
fn f(a: &str, b: &str) -> ...
// 等价于
fn f<'a, 'b>(a: &'a str, b: &'b str) -> ...
// 规则 2:只有一个输入生命周期,赋给所有输出
fn f(a: &str) -> &str
// 等价于
fn f<'a>(a: &'a str) -> &'a str
// 规则 3:&self 或 &mut self 的生命周期赋给所有输出
fn f(&self, x: &str) -> &str
// 等价于
fn f<'a, 'b>(&'a self, x: &'b str) -> &'a str
高阶 Trait Bound (HRTB)
// for<'a> 表示"对任意生命周期 'a"
fn apply<F>(f: F, s: &str) -> String
where
F: for<'a> Fn(&'a str) -> &'a str,
{
f(s).to_string()
}
生命周期子类型
// 'static 是最长的生命周期
// 'a: 'b 表示 'a 至少和 'b 一样长
fn longer<'a: 'b, 'b>(x: &'a str, _y: &'b str) -> &'b str {
x // x 的生命周期 'a 比 'b 长,所以可以返回
}
匿名生命周期
// '_ 表示让编译器推断
fn process(s: &str) -> &'_ str {
&s[..1]
}
// 在 impl 中
impl MyStruct<'_> {
fn method(&self) -> &str { "" }
}
小结
| 概念 | 说明 |
|---|---|
| 省略规则 | 3 条规则自动推断 |
for<'a> | 高阶生命周期 |
'a: 'b | 生命周期约束 |
'_ | 匿名生命周期 |
'static | 最长生命周期 |
练习编辑器
rust
Loading...