Rust 所有权 — 最核心的概念
深入理解 Rust 所有权系统的三大规则:移动、克隆、借用 · 难度:高级 · +30XP
所有权(Ownership)—— Rust 的灵魂
所有权是 Rust 最独特、最重要的概念。理解它,就理解了 Rust 的一半。三条铁律:
- Rust 中每个值都有唯一的所有者(owner)
- 同一时刻,一个值只能有一个所有者
- 所有者离开作用域(scope),值被自动释放(调用 drop)
规则 1+2:移动(Move)
把一个值赋给另一个变量时,所有权转移。原来的变量不能再用了:
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权移动到 s2
// println!("{s1}"); // ❌ 编译错误!s1 已经失效了!
println!("{s2}"); // ✅ s2 现在是所有者
这就像你把一本书送给朋友——书还在,但不再属于你了。
克隆(Clone)—— 深拷贝
如果你真的需要两份独立的数据,用 .clone() 深拷贝:
let s1 = String::from("hello");
let s2 = s1.clone(); // 深拷贝,两个独立的值
println!("s1 = {s1}, s2 = {s2}"); // ✅ 两个都能用
规则 3:作用域和释放
{
let s = String::from("hello"); // s 进入作用域
// 使用 s...
} // s 离开作用域,内存自动释放
// s 在这里不可用了
不需要手动 free,不需要垃圾回收——Rust 在编译时就插入了正确的释放代码。
函数与所有权
fn take_ownership(s: String) { ... } // s 获取所有权
fn borrow(s: &String) { ... } // s 借用,不获取所有权
let s = String::from("hi");
take_ownership(s); // s 的所有权移入函数
// s 在这里不可用了!
let t = String::from("hey");
borrow(&t); // 只是借用
println!("{t}"); // ✅ t 还能用!
动手试试
- 创建一个 String,用 clone() 复制它
- 试着把一个 String 传给函数后,再在外部使用它(看编译错误)
- 用 & 借用传给函数,体会和移动的区别