数据结构中的生命周期

如果数据类型存储了借用的数据,则必须对其添加生命周期注释:

#[derive(Debug)]
struct Highlight<'doc>(&'doc str);

fn erase(text: String) {
    println!("Bye {text}!");
}

fn main() {
    let text = String::from("The quick brown fox jumps over the lazy dog.");
    let fox = Highlight(&text[4..19]);
    let dog = Highlight(&text[35..43]);
    // erase(text);
    println!("{fox:?}");
    println!("{dog:?}");
}
This slide should take about 5 minutes.
  • 在上述示例中,Highlight 注释会强制包含 &str 的底层数据的生命周期至少与使用该数据的任何 Highlight 实例一样长。
  • 如果 textfox(或 dog)的生命周期结束前被消耗,借用检查器将抛出一个错误。
  • 借用数据的类型会迫使用户保留原始数据。这对于创建轻量级视图很有用,但通常会使它们更难使用。
  • 如有可能,让数据结构直接拥有自己的数据。
  • 一些包含多个引用的结构可以有多个生命周期注释。除了结构体本身的生命周期之外,如果需要描述引用之间的生命周期关系,则可能需要这样做。这些都是非常高级的用例。