⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Rust 所有权 — 最核心的概念

深入理解 Rust 所有权系统的三大规则:移动、克隆、借用 · 难度:高级 · +30XP

所有权(Ownership)—— Rust 的灵魂

所有权是 Rust 最独特、最重要的概念。理解它,就理解了 Rust 的一半。三条铁律:

  1. Rust 中每个值都有唯一的所有者(owner)
  2. 同一时刻,一个值只能有一个所有者
  3. 所有者离开作用域(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 还能用!

动手试试

  1. 创建一个 String,用 clone() 复制它
  2. 试着把一个 String 传给函数后,再在外部使用它(看编译错误)
  3. 用 & 借用传给函数,体会和移动的区别
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 122 篇
0 完成
🔥 0