惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
D
Docker
腾讯CDC
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
IT之家
IT之家
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】

Rust

Tower 限流中间件,主要面向 HTTP 服务,专注固定窗口限流。 - V2EX 折腾了一阵 Rust + Cosmopolitan, 搭了套工具链,现在能把一些常用的 cli 工具编译到 APE 了 - V2EX [开源自推]我用 Rust 做了一个约 30 MiB 内存的多入口 AI Agent,已经在线跑了半年 - V2EX [开源] rload: 仅 3.5MB 内存,原生支持 Nginx 日志回放的 Rust 高性能压测工具 - V2EX RustScript: 给你的 Rust 项目带来脚本化功能 RUST 语法极其丑陋 一款跑在终端里的本地优先密码管理器,用全屏 TUI 管理账号、密钥和安全笔记。 如何理解 rust 闭包的借用值机制? 被借用的值在闭包内到底是什么类型? [开源] Best of RS - 一个由 Rust 编写的追踪 Rust 开源趋势的全栈 web 项目 Rust 真是非常适合 AI vibe coding 的语言 Pumpkin - 使用 Rust 开发的高性能 Minecraft 服务端 开源这两天 Vibe 的 Rust 重写的 OpenClaw 用 rust 写了一个非常简单的局域网文本同步的小玩意 [寻求帮助 Linux ] 用 rust 写了一个跨平台输入监听库(鼠标键盘) Contributions to Rust and LLVM in 2025 Linux 内核中的 rust 2025 年度 Rust 语言社区调查 已经发布 rust 让我抓狂、擦汗 推荐一款我写的动态配置语言: Faml 如何看待 Rust? Rust Web 开发脚手架 v0.6 发布啦! rathole 这个项目是不维护了吗? 之前那个 rust 贡献大佬找到工作了,找他的团队还不少 太快了! Rust 太快了! 介绍一个 like rails 的 rust 框架。 性能和开发速度都快。 除了写小工具外再也不想用 Rust 了 rust 我想你了 rust 程序员的硬盘是多大的? nodejs 继任者? rust 练手写的,仿 uv 包管理器 av Rust 的安全神话?为何在关键系统如数据库、大模型代码中仍选 C++
关于 Rust 所有权,如果对 mut 变量进行嵌套 mut 引用该怎么...
KlesaOff · 2025-01-15 · via Rust

最近在自学 Rust ,因为之前粗略看过一些博客教程,所以这次直接看Programming Rust这本书的翻译版,在第 5 章“引用”中遇到一个例子,感觉不能理解。

首先看书中图 5-9 的所有权树,讲了对于可变和不可变引用时的访问关系,我以为自己理解了,可是后面看到这个例子,结果又看不明白,代码是这样的:

...
也可以再次借用一个可变引用:
let mut v = (136, 139);
let m = &mut v;
let m0 = &mut m.0;  // ok:从可变引用重新借用可变引用
*m0 = 137;
let r1 = &m.1;      // ok:从可变引用重新借用共享引用,并且和 m0 没有重叠部分
v.1;		        // error:通过其他路经访问仍然是禁止的
println!("{}", r1); // r1 在这里使用

其实从第一个 ok 注释那里我就没搞明白,不是说变量只能同时存在一个可变引用吗,为什么有可变引用(“引用”为名词)m 的情况下还能从 m 那再可变引用(“引用”为动词)一个 m0 ?

然后我问 gpt ,它是这么回答的:

...

嵌套 mut 引用的场景

假设你有一个可变变量,并希望对其创建嵌套的可变引用。以下 是一些常见的情况及其分析。

情况 1:对整个变量的可变引用,然后尝试对部分值的可变引用

fn main() {
    let mut x = (1, 2);

    let r1 = &mut x;       // 对整个变量 `x` 的可变引用
    let r2 = &mut r1.0;    // 尝试对 `x` 的一部分创建可变引用

    *r2 = 42;              // 修改部分值
    r1.1 = 99;             // 修改另一部分
}

错误原因: Rust 编译器会报错,提示 不能同时借用 x 的多个可变引用。这是因为:

r1 是对整个 x 的可变引用,它控制了 x 的独占访问权。 当你尝试对 r1.0 ( x 的某个字段)创建可变引用时,r1 的作用域依然活跃,Rust 无法区分你是否会同时操作 x 的其他部分。

错误示例的编译器消息(可能类似于):

error[E0499]: cannot borrow `r1.0` as mutable more than once at a time

...

但事实上,我尝试了类似代码,并不会报错:

fn main() {
    let mut v = (136, 139);
    let m = &mut v;
    let m0 = &mut m.0;
    *m0 = 137;
    m.1 = 42;
    println!("{:?}", v)
}

其运行结果是:

(137, 42)

很多资料都没有讲解关于这种嵌套的引用会发生什么结果,也不知道什么情况是可以什么是不行,我没看过这例子时还以为压根不能创建 m0 呢,所以想着找 GPT 问问,结果告诉的内容是错的。

请问该如何解释上面书中的代码,如何更好地理解 Rust 在这种嵌套情况下创建引用的做法是否成功?请各位赐教