0Pricing
Learn Rust Coding · 课时

为什么需要生命周期

防止悬空引用

为什么需要生命周期 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

引用必须保持有效

引用借用它不拥有的数据。Rust 必须保证数据至少与引用存活一样久。生命周期就是编译器跟踪这一点的方式。

它们的作用是防止悬垂引用。

什么是悬垂引用

悬垂引用指向已经释放的内存。在没有检查机制的语言中,使用悬垂引用会导致崩溃或安全漏洞。Rust 会拒绝编译这样的代码。

借用检查器的实际运行

这段代码会创建一个指向即将离开作用域的值的引用。Rust 会在编译时拒绝它。生命周期就是 Rust 用来作出判断的规则。

fn main() {
    let r;
    {
        let x = 5;
        r = &x;
        println!("inside: {}", r);
    }
    // using r here would be a dangling reference
    println!("done");
}

作用域定义生命周期

值的生命周期是它保持有效的时间范围,通常就是它的作用域。引用的存活时间不能超过它所指向的值。

这里 x 和引用位于同一作用域中,因此没有问题。

fn main() {
    let x = 5;
    let r = &x;
    println!("x is {}, r is {}", x, r);
}

返回引用

返回引用的函数必须返回一个在调用者那里仍然有效的引用。您不能返回局部变量的引用,因为函数结束时局部变量就会失效。

返回输入的借用

您可以返回一个借用自输入的引用。只要输入有效,结果就有效。这正是生命周期注解所描述的内容。

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &b) in bytes.iter().enumerate() {
        if b == b' ' {
            return &s[..i];
        }
    }
    s
}

fn main() {
    let sentence = String::from("hello world");
    println!("{}", first_word(&sentence));
}

生命周期仅存在于编译时

生命周期完全是编译时概念。它们不会产生运行时开销,只用于让借用检查器验证内存安全。

所有权与生命周期协同工作

所有权决定谁释放值;生命周期决定对该值的借用可以存活多久。两者结合后,Rust 无需垃圾回收器也能保证安全。

fn main() {
    let data = vec![1, 2, 3];
    let view = &data[0..2];
    println!("{:?}", view);
    // data still owns the vector; view just borrows part of it
    println!("{:?}", data);
}

为什么签名中会出现名称

当函数接受多个引用时,编译器有时无法判断它们的生命周期之间是什么关系。这时您需要添加生命周期注解来明确这些关系。

下一课将介绍这种语法。

生命周期带来的好处

由于生命周期,整类错误——释放后使用、悬垂指针、迭代器失效——根本无法通过编译。您可以同时获得类似 C 的速度和内存安全。

心智模型

可以把生命周期想象成数据存活时长上的标签。引用携带这样的约束:只有在来源仍然存活时,我才有效。借用检查器会强制执行这一约束。

快速检查

检验您对生命周期为何存在的理解。

回顾

您学习了生命周期存在的原因:

  • 引用的存活时间不能超过其借用的数据
  • 生命周期在编译时防止悬垂引用
  • 生命周期只存在于编译时,不产生运行时开销
  • 生命周期与所有权协同工作,无需垃圾回收器即可保证内存安全

常见问题解答

「为什么需要生命周期」课时是免费的吗?

是的 — 「为什么需要生命周期」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「为什么需要生命周期」这节课中我会学到什么?

防止悬空引用 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「为什么需要生命周期」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么需要生命周期
  2. 生命周期注解
  3. 结构体中的生命周期
  4. 省略规则
← 返回 Learn Rust Coding