为什么需要生命周期
防止悬空引用
为什么需要生命周期 是 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 反馈 — 无需本地设置。