目录

  1. 什么是 Rust 生命周期
  2. 为什么要使用生命周期
  3. 生命周期的定义与语法
  4. 生命周期省略规则
  5. 生命周期与结构体
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 生命周期

Rust 生命周期 (Lifetime) 是编译器用来追踪引用有效性的机制,确保引用不会指向已释放的内存(悬垂引用)。它通过显式或隐式的生命周期注解,保证内存安全。


为什么要使用生命周期

  • 内存安全:防止引用失效。
  • 借用检查:确保引用的使用符合所有权规则。
  • 编译时验证:避免运行时错误。
  • 灵活性:支持复杂的引用关系。

生命周期的定义与语法

  • 语法:使用 'a(单引号加标识符)表示生命周期。
  • 应用
  • 函数参数:&'a T
  • 返回值:指定输入与输出的生命周期关系。
  • 约束'a: 'b 表示 'a 至少和 'b 一样长。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

生命周期省略规则

Rust 编译器会根据以下规则自动推断生命周期(无需显式注解):

  1. 每个引用参数有独立生命周期。
  2. 如果只有一个输入生命周期,返回值生命周期与它相同。
  3. 如果方法接收 &self&mut self,返回值生命周期与 self 相同。
fn first_word(s: &str) -> &str {  // 省略生命周期
    s.split(' ').next().unwrap()
}

生命周期与结构体

  • 结构体字段若包含引用,需显式声明生命周期。
  • 生命周期参数与结构体绑定。
struct Excerpt<'a> {
    part: &'a str,
}

代码示例

基本生命周期

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

fn main() {
    let s1 = String::from("Rust");
    let s2 = "Python";
    let result = longest(&s1, s2);
    println!("Longest: {}", result);
}

运行结果:

Longest: Python

生命周期省略

fn first_char(s: &str) -> &str {  // 编译器推断生命周期
    &s[0..1]
}

fn main() {
    let s = "Hello";
    println!("First char: {}", first_char(s));
}

运行结果:

First char: H

结构体与生命周期

struct Book<'a> {
    title: &'a str,
    author: &'a str,
}

fn main() {
    let title = String::from("Rust Book");
    let author = String::from("Jane Doe");
    let book = Book {
        title: &title,
        author: &author,
    };
    println!("Title: {}, Author: {}", book.title, book.author);
}

运行结果:

Title: Rust Book, Author: Jane Doe

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持