一句话核心:
“所有权决定数据归属,借用控制临时访问;可变/不可变绑定管变量灵活度,&/&mut** 定数据读写权。”**
一、所有权与借用规则(基础)
- 所有权:数据有唯一主人,
move转移所有权,超出作用域自动释放。 - 借用:通过引用
&T或&mut T临时使用数据,不转移所有权。 - 借用铁律:
- 不可变借用可共享:多个
&T同时存在。 - 可变借用独占:同一作用域内只能有一个
&mut T,且不能有&T共存。 - 作用域限定:借用必须晚于被借用数据创建,早于数据释放。
- 不可变借用可共享:多个
二、可变 vs 不可变绑定(关键区分)
| 绑定类型 | 语法 | 比喻 | 权限说明 |
|---|---|---|---|
| 不可变绑定 | let x = &data; | 焊死的只读卡 | ① 变量 x 不能改指向 ② 不能通过 x 修改数据 (*x = ... 报错) |
| 可变绑定 | let mut x = &data; | 可换书的只读卡 | ① 可改 x 指向 (x = &new_data) ② 仍不能改数据 |
| 可变引用 | let x = &mut data; | 焊死的编辑笔 | ① 变量 x 不能改指向 ② 可通过 *x 修改数据 |
| 可变绑定 + 可变引用 | let mut x = &mut data; | 可换书的编辑笔 | ① 可改 x 指向 (x = &mut new_data) ② 可改数据 |
三、解引用(Dereferencing)
- 操作:用
*操作符通过引用获取原始数据(如*x获取x: &T背后的T)。 - 用途:通过引用修改数据(如
*x = 5;)或调用方法(编译器常自动解引用)。 - 比喻:按藏宝图 (
&) 挖出宝藏 (*)。
四、记忆口诀与实战技巧
- “一主多读,一写独占” :一个数据可多读 (
&),但同一时间只能被一个写 (&mut)。 - **默认选 **
&:优先使用不可变引用,更安全。 mut** 双含义**:let mut x: 允许变量x换绑定(指向其他数据)。&mut: 允许 修改数据,但变量本身仍是不可变绑定(除非再加let mut)。
- 报错排查:
- 无法修改数据?检查是否有
&mut。 - 编译报错“已存在可变借用”?检查作用域内是否有重叠的可变引用。
- 无法修改数据?检查是否有
五、生命周期(简要)
- 引用不能超过被引用数据的生命周期(如函数内临时变量不能作为返回值引用),但 Rust 通过生命周期注解自动检查,多数情况无需手动标注。
🔥 终极口诀:
“所有权是根,借用是枝;可变不可变,绑定和引用要分清;解引用挖数据,规则守好不慌张!”