网易首页 > 网易号 > 正文 申请入驻

Rust把1行代码藏了3层糖衣,编译器差点没认出来

0
分享至

写Rust的人里有83%自认懂所有权系统,但真拿这几段代码考他们,能全答对的不到两成。这不是我编的——作者Jamie Brandon在写自己的借用检查器时,反复对照Rust官方行为,发现连资深开发者都会给出"自信但错误"的解释。

借用检查器的黑箱,比多数人想象的更深。

Brandon做了件狠事:把Rust编译器的"意外行为"做成互动测验。每道题先看代码自己推理,再点揭晓。结果?"一旦看到答案,你会觉得自己早就知道"——这种认知错觉正是陷阱所在。

第一题:同一行里先读再写,凭什么能过?

代码极简:

let mut x = 0;let y = &mut x;*y = *y + 1;

左边`*y`是赋值目标,需要可变引用;右边`*y + 1`要从`x`读取。按直觉,可变借用和不可变借用不能共存,这行应该报错。

但编译通过了。为什么?

Brandon用显式代码块验证了求值顺序:

*({println!("lhs"); y}) = {println!("rhs"); *y + 1};

输出是`rhs`先,`lhs`后。右侧表达式先求值,此时`x`还未被可变借用,读取合法;左侧后求值,才建立可变引用。时间差救了这行代码。

第二题:`+=`的糖衣剥完,编译器翻脸了

这题更刁。起点 innocuous:

let mut x = 0;x += x;

显然能过。但`+=`是语法糖,展开成`AddAssign::add_assign`方法调用:

x.add_assign(x);

还能过。再剥一层:方法调用也是糖,实际是普通函数调用`add_assign(&mut x, x)`。

这次编译器炸了:

error[E0503]: cannot use `x` because it was mutably borrowed

同一个语义,三层语法糖,两层能过一层报错。Rust有个叫"两阶段借用"(two-phase borrows)的隐藏机制,只在特定场景触发——方法调用语法`.`是其中之一,普通函数调用不是。

机制细节:第一个`x`先被当作不可变引用捕获,等其他参数求值完,再"升级"成可变引用。剥完糖衣变成函数调用,这个特权就消失了。

第三题:Move语义的老朋友

最后一题是送分题,但放在这里别有用心:

let z = y;*y = 1;  // 报错:use of moved value

可变引用`&mut T`不实现`Copy` trait,`y`被move给`z`后自然失效。这题没人会错,但 Brandon 的用意明显:前面两题的"意外"之所以难察觉,恰恰因为Rust大部分时候确实如你预期,麻痹了警觉。

三题看完,一个模式浮现:Rust的借用规则在纸面上简洁,实际执行却依赖求值顺序、语法糖展开、隐藏机制等未言明的实现细节。这些不是bug,是设计权衡——但文档没告诉你,编译器报错也不会解释。

Brandon 的测验在GitHub和 lobste.rs 引发大量讨论。有开发者承认"第三题我以为懂,前两题全靠猜";也有人反驳"这些边缘案例不值得关心"。

争议本身说明问题:Rust社区长期宣传"编译器即文档",但编译器的实际行为与用户的 mental model 之间存在系统性的信息缺口。这个缺口不会阻止你写代码,但会在你调试生命周期错误时,让每一分钟都变得更漫长。

Brandon 最后没给结论,只留了个开放问题:如果你正在设计一门新语言,会为了用户直觉的简洁性,牺牲这些实现层面的优化空间吗——还是说,正确的答案从来不在二选一?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
《纽约时报》万字报道,称已找到比特币发明者中本聪真实身份

《纽约时报》万字报道,称已找到比特币发明者中本聪真实身份

大厂观察
2026-04-09 09:58:15
哪个大聪明想出来的,用瓶盖收纳鸡蛋!

哪个大聪明想出来的,用瓶盖收纳鸡蛋!

新住家居
2026-04-09 07:06:35
伊朗:击落“赫尔墨斯”无人机,任何类型的美以敌机进入伊朗领空,即使没有进行军事行动,也被视为违反停火协议,并将受到坚决回应

伊朗:击落“赫尔墨斯”无人机,任何类型的美以敌机进入伊朗领空,即使没有进行军事行动,也被视为违反停火协议,并将受到坚决回应

极目新闻
2026-04-08 22:54:20
菲律宾断电泰国停飞!131万吨救命气转售,中国:溢价85%,不讲价

菲律宾断电泰国停飞!131万吨救命气转售,中国:溢价85%,不讲价

青青子衿
2026-04-08 21:12:34
贾浅浅终于接受组织调查

贾浅浅终于接受组织调查

英军眼
2026-04-09 09:50:51
看完伊朗停火声明,忍不住潸然泪下,这是一个了不起的民族

看完伊朗停火声明,忍不住潸然泪下,这是一个了不起的民族

清沐执笔
2026-04-08 16:22:11
陈吉宁会见中国国民党主席郑丽文

陈吉宁会见中国国民党主席郑丽文

澎湃新闻
2026-04-08 22:56:27
那个专门网暴全红婵的微信群里都有谁?

那个专门网暴全红婵的微信群里都有谁?

常识群
2026-04-09 09:11:22
全红婵报警:潜伏裁判给低分,郭晶晶看出猫腻,过往不公彻底曝光

全红婵报警:潜伏裁判给低分,郭晶晶看出猫腻,过往不公彻底曝光

眼光很亮
2026-04-08 14:51:46
以色列称“将尊重与伊朗的停火”协议

以色列称“将尊重与伊朗的停火”协议

参考消息
2026-04-08 11:46:24
达赖深度卷入爱泼斯坦权色网,印媒再爆惊人新证据:其自称“观音菩萨化身”竟是爱泼斯坦的座上宾,两人之间“令人不安的秘密联系”被揭开

达赖深度卷入爱泼斯坦权色网,印媒再爆惊人新证据:其自称“观音菩萨化身”竟是爱泼斯坦的座上宾,两人之间“令人不安的秘密联系”被揭开

大风新闻
2026-04-09 10:58:08
伊朗接受停火,等于卖了真主党,一旦谈判破裂,恐再也没有帮手!

伊朗接受停火,等于卖了真主党,一旦谈判破裂,恐再也没有帮手!

基斯默默
2026-04-09 03:56:52
全红婵遭群聊辱骂再升级!国家一锤定音,主谋被扒,势力大也没用

全红婵遭群聊辱骂再升级!国家一锤定音,主谋被扒,势力大也没用

林雁飞
2026-04-08 20:07:41
亏损234亿!“中国巴菲特”道歉

亏损234亿!“中国巴菲特”道歉

侃见财经
2026-04-09 08:53:27
河北两名群众、一名辅警为救落水女子不幸牺牲,四人全部遇难,事发地被市民摆满鲜花,当地多方回应

河北两名群众、一名辅警为救落水女子不幸牺牲,四人全部遇难,事发地被市民摆满鲜花,当地多方回应

大风新闻
2026-04-08 18:56:14
女租户疑因被扣押金 退房后用水泥堵住7个下水管 房东:衣柜上方、床下还有腐肉

女租户疑因被扣押金 退房后用水泥堵住7个下水管 房东:衣柜上方、床下还有腐肉

闪电新闻
2026-04-08 23:38:47
初三女生被5名舍友欺负致右髌骨骨折, 警方行政立案,校园欺凌认定三个月无结果

初三女生被5名舍友欺负致右髌骨骨折, 警方行政立案,校园欺凌认定三个月无结果

大风新闻
2026-04-09 11:09:13
从出海口到桥头堡——东风风行埃及KD工厂量产

从出海口到桥头堡——东风风行埃及KD工厂量产

车大拿
2026-01-25 08:56:57
企稳增效,厚积薄发:上汽,稳在深处,进在实处

企稳增效,厚积薄发:上汽,稳在深处,进在实处

汽车预言家
2026-04-09 10:27:53
拿40万镑周薪 利物浦头牌欧冠关键战坐穿板凳+面无表情 或0冠告别

拿40万镑周薪 利物浦头牌欧冠关键战坐穿板凳+面无表情 或0冠告别

我爱英超
2026-04-09 05:24:34
2026-04-09 13:04:49
灰度测试中
灰度测试中
生活正在重构,目前还在灰度测试阶段,暂不全量发布。
967文章数 12关注度
往期回顾 全部

科技要闻

Meta凌晨首发闭源大模型 扎克伯格又行了?

头条要闻

达赖深度卷入爱泼斯坦权色网 印媒再披露惊人新证据

头条要闻

达赖深度卷入爱泼斯坦权色网 印媒再披露惊人新证据

体育要闻

40岁,但实力倒退12年

娱乐要闻

具俊晔最新露面,又黑又瘦情绪低迷

财经要闻

谈判基础已被破坏!霍尔木兹海峡关闭

汽车要闻

8155芯片+L2智驾 瑞虎5运动版上市 置换补贴价6.79万元起

态度原创

游戏
艺术
家居
亲子
军事航空

人熊大战幕后:真的要玩这么大!《神界》或更炸裂

艺术要闻

庞茂琨 2026油画写生新作

家居要闻

清新自然 复古风尚

亲子要闻

福州儿童/青少年配眼镜推荐:专业验光+定制方案+售后无忧,家长关心的都在这

军事要闻

霍尔木兹海峡已再次关闭

无障碍浏览 进入关怀版