·tech
Rust 入门 — 所有权与借用的直觉理解
用直觉理解 Rust 的所有权、借用、生命周期三大核心概念,配以代码示例和实践建议。
Rust 入门 — 所有权与借用的直觉理解
Rust 的所有权系统是初学者最大的障碍,也是 Rust 最强大的特性。本文试图用直觉而非理论来解释它。
为什么需要所有权?
在 C 语言中,你需要手动管理内存:
c4 L
char* str = malloc(100);
// ... 使用 str ...
free(str); // 忘记这行 → 内存泄漏
// // 提前 free → use-after-free 漏洞Rust 的答案是:让编译器在编译时自动追踪每一块内存的"主人"。
三条核心规则
| 规则 | 含义 |
|---|---|
| 每个值有且只有一个所有者 | 值的主人负责释放它 |
| 同一时刻只能有一个可变引用 | 防止数据竞争 |
| 可以有多个不可变引用 | 允许并发读取 |
代码示例
rust26 L
fn main() {
// s1 是 String 的所有者
let s1 = String::from("hello");
// 所有权转移给 s2 — s1 不再有效
let s2 = s1;
// println!("{}", s1); // ❌ 编译错误!s1 已被移动
// 借用:&s2 创建一个不可变引用
let len = calculate_length(&s2);
println!("The length of {} is {}.", s2, len);
// 可变借用
let mut s3 = String::from("hello");
change(&mut s3);
println!("{}", s3); // "hello, world"
}
fn calculate_length(s: &String) -> usize {
s.len()
}
fn change(s: &mut String) {
s.push_str(", world");
}常见误解
误解:所有权让 Rust 变得难写。 事实:所有权让你在编译时发现 bug,而不是在生产环境崩溃。
实践建议
- 从 clone() 开始 — 先让代码跑起来
- 学会使用 引用 (&) — 避免不必要的克隆
- 理解 生命周期标注 — 当编译器无法推断时提供帮助
- 善用 String vs &str — 区分拥有和借用
下一篇将介绍 Rust 的错误处理与模式匹配。