61·进阶特性高级

生命周期进阶

生命周期进阶

学习目标

  1. 理解生命周期省略规则细节
  2. 掌握高阶 trait bound (HRTB)
  3. 理解生命周期子类型

核心概念

省略规则详解

// 规则 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...