Skip to content

Rust引用与借用一

芯笑

Rust 的安全感来自一条“死规矩”:谁申请的内存、谁负责把它收回。理解这条规矩离不开两个舞台——栈和堆。下面用三段小代码,但把重点放在“钥匙怎么传、数据在哪里”。

先掰清:栈与堆在 Rust 里的分工

可以这么记:栈放“门牌”,堆放“房子”;拿到门牌才能找到房子。

例子一:String——“搬家”与“借住”有本质区别

fn suy_uj() {
    let m1 = String::from("hello");   // 栈:3 元组门牌 → 堆:hello
    let m2 = String::from("world");

    // greeat(m1, m2);               // ❌ 把门牌 *移交*,自己失去一切权利
    greeat_y(&m1, &m2);              // ✅ 只“借钥匙”,权利仍在自己手里
    println!("还能用 m1,m2: {} {}", m1, m2);
}

为什么直接传 m1、m2 会出错?

为什么加 & 就安全?

一句口诀: 传值 = 把钥匙交出去;传 &值 = 借钥匙但保留房契。

例子二:Box——唯一房东 vs. 游客卡

fn kj() {
    let x = Box::new(1);       // x 是唯一房东(门牌)→ 堆: 1
    let y = x;                 // 房契过户给 y,x 失效

    let r1 = &y;               // 游客卡,只能看
    let r2 = &y;               // 再来一张
    // y 本身依旧有改房功能(可写)——只要游客卡不存在 &mut 冲突
}

Box 为什么只允许一个房东?

引用在 Box 世界里的角色

一句口诀: Box 门牌只能过户,不能复印;引用是复印件,但只能看不能改。

快速对比:引用与所有权的关系

场景有无所有权读/写权限何时释放堆内存
m1 传值✅ 转移读 + 写新房东作用域结束
&m1❌ 仅借用默认只读(若要写需 &mut原房东作用域结束
Box 移动✅ 转移读 + 写新房东作用域结束
&Box<T>❌ 仅借用只读(若要写需 &mut Box<T>原房东作用域结束

*若借用方要写,必须借 &mut,此时编译器保证没有任何其他引用存在。

引用 = “临时钥匙”,借完归还,不动房契。移动 = “过户”,以后谁持有谁拆房,旧房东立刻失效。

例子三——逐帧“透视”借用检查器

pub fn nj() {
    let x = 0;                  // ──①
    let mut x_ref = &x;         // ──②
    println!("{}", x_ref);      // ──③

    let y = 1;                  // ──④
    x_ref = &y;                 // ──⑤
}

下面把代码按 ①-⑤ 五个瞬间“定格”,看看 Borrow Checker(借用检查器)如何分配 读 / 写 权限。

① let x = 0;

② let mut x_ref = &x;

③ println!(”{}”, x_ref);

④ let y = 1;

⑤ x_ref = &y;

借用检查器到底做了什么?

小结 —— 读写权限一览

瞬间x 权限x_ref 权限y 权限①读+写——②③读读—④读读读+写⑤读+写读 (&y)读

一句话记住:引用变量可“改绑”并不代表能“改房子”;真正想改房子,就得拿到那把唯一的可写钥匙 &mut T。

分享
上一篇
Spring Boot 默认 DataSource 自动配置机制解析
下一篇
用 gRPC 打造最终一致的 AP-模式注册中心