⚡ 编程实验室🏗️ 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 借用与引用 — 安全地共享数据

& 不可变借用、&mut 可变借用、借用规则详解 · 难度:进阶 · +25XP

借用(Borrow)—— 使用值但不获取所有权

借用让你可以使用一个值而不夺取所有权。用 & 创建引用。

不可变借用(&T)

fn print_len(s: &String) {   // 借用,不获取所有权
    println!("长度: {}", s.len());
}

let s = String::from("hello"); print_len(&s); // 传入引用 println!("{s}"); // ✅ s 还能用!所有权没有转移

可变借用(&mut T)

如果要在函数中修改借用的值,用 &mut

fn append_world(s: &mut String) {
    s.push_str(" world");
}

let mut s = String::from("hello"); append_world(&mut s); println!("{s}"); // hello world

借用规则(编译器强制检查)

  1. 同一时刻,可以有多个不可变借用(&T)
  2. 同一时刻,只能有一个可变借用(&mut T)
  3. 不可变借用和可变借用不能同时存在

这些规则在编译时检查,零运行时开销。它们保证了永远不会出现数据竞争

借用 vs 移动 对比

操作所有权后续能用吗
let s2 = s1(移动)转移❌ s1 失效
let r = &s1(不可变借用)不转移✅ s1 还能用
let r = &mut s1(可变借用)不转移✅ s1 还能用(但借用期间不能有其他引用)

动手试试

  1. 创建可变 String,用 &mut 借用修改它
  2. 同时尝试创建两个 &mut 引用(看编译错误)
  3. 先创建 & 引用,再尝试创建 &mut 引用(看编译错误)
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 122 篇
0 完成
🔥 0