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
借用规则(编译器强制检查)
- 同一时刻,可以有多个不可变借用(&T)
- 同一时刻,只能有一个可变借用(&mut T)
- 不可变借用和可变借用不能同时存在
这些规则在编译时检查,零运行时开销。它们保证了永远不会出现数据竞争。
借用 vs 移动 对比
| 操作 | 所有权 | 后续能用吗 |
|---|---|---|
let s2 = s1(移动) | 转移 | ❌ s1 失效 |
let r = &s1(不可变借用) | 不转移 | ✅ s1 还能用 |
let r = &mut s1(可变借用) | 不转移 | ✅ s1 还能用(但借用期间不能有其他引用) |
动手试试
- 创建可变 String,用 &mut 借用修改它
- 同时尝试创建两个 &mut 引用(看编译错误)
- 先创建 & 引用,再尝试创建 &mut 引用(看编译错误)