老铁们,坐稳了。Rust 官方又端上了一盘热气腾腾的新菜——1.89.0 版本。

别急着 rustup update stable,这次的更新,可不只是加点语法糖那么简单。里面藏着一个时代的眼泪,和一个能让无数新手喜大普奔的“贴心大妈”。

本兽这就带你深度解剖,看看这盘菜到底有多硬核。

一个时代的落幕:再见,x86_64-apple-darwin

第一个要说的,就是这件大事。

这么多年,苹果和英特尔的爱情长跑,终究是错付了。随着苹果全面拥抱自家的 Apple Silicon 芯片,以及隔壁 GitHub 宣布不再为公共仓库提供免费的 macOS x86_64 虚拟机,Rust 官方也正式表态了。

从 1.89 版本开始,x86_64-apple-darwin,也就是我们熟知的 Intel Mac 平台,正式从“亲儿子”(Tier 1)降级为“干儿子”(Tier 2)。

这是什么意思?

我给你打个比方。以前,Intel Mac 是 Rust 开发团队捧在手心里的宝,每次发版都得保证所有测试跑得通,功能好使。现在,它变成了“自生自灭”模式。官方还会编译工具链,但不再保证所有测试都通过。哪天你发现某个功能在你的老 Intel Mac 上不好使了,别惊讶,这可能就是时代的阵痛。

所以,如果你还在用 Intel Mac 写 Rust,是时候考虑一下未来了。要么抱紧你的 1.89 版本,要么……是时候换台新电脑了。

编译器化身“朝阳大妈”,专治生命周期“隐形情侣”

好了,说完沉重的话题,来说个喜闻乐见的。

Rust 的“生命周期”(Lifetime),这玩意儿劝退了多少英雄好汉?它就像代码里的“玄学”,尤其是那个“生命周期省略规则”(Lifetime Elision),更是神出鬼没。

有时候,一个函数明明返回了一个带生命周期的东西,但你从签名上压根看不出来。比如下面这个:

// 返回的 Iter 是有生命周期的,但你看得出来吗?
fn items(scores: &[u8]) -> std::slice::Iter<u8> {
   scores.iter()
}

这里的 &[u8],明眼人一看就知道带了个生命周期,像是在公开场合牵着手的情侣。但返回的 std::slice::Iter<u8> 呢?它也悄悄地“借”了 scores 的生命周期,却装作一副“单身贵族”的样子。

这种输入和输出在生命周期上“一个在明,一个在暗”的情况,就像一对“隐形情侣”,极易让人迷惑,一不小心就写出悬垂指针的 BUG。

现在,Rust 1.89 的编译器化身成了火眼金睛的“朝阳大妈”,推出了全新的 mismatched_lifetime_syntaxes lint(默认开启),专门整治这种“地下恋情”!

再遇到上面的代码,编译器大妈会直接给你一个警告,语重心长地劝你:

“小伙子,你这俩变量关系不一般呐,得让大家看清楚!在返回类型那给我老老实实写上 <'_, u8>,别藏着掖着!”

这个改动,堪称新手福音。它把“潜规则”变成了“明规则”,让代码的可读性和安全性又上了一个台阶。

给CPU特种兵的新装备,和一些“懒人福音”

除了上面两个重头戏,1.89 版本还带来了一堆好东西:

1. 常量泛型里的“你猜”模式: 以前在数组里,长度必须写得明明白白。现在,你可以用 _ 来让编译器自己猜。

pub fn all_false<const LEN: usize>() -> [bool; LEN] {
  [false; _] // 编译器:懂了,就是要 LEN 个 false 嘛!
}

这就像你妈让你去打酱油,但没说要几块钱的,老板一看你手里提的菜,就心领神会给你打了正好一盘菜的量。舒服!

2. CPU 指令集大放送: 为 x86 平台上的“特种兵”们发放了一批新武器,比如 sha512, sm3, sm4, avx512 等一大堆新指令集的支持。如果你是做高性能计算或者加密算法的,这波属于是“鸟枪换炮”了。

3. 其他稳定API: 还一口气稳定了一大波 API,比如 File::lock 系列的文件锁功能,Result::flatten 让你能更优雅地处理嵌套的 Result,还有 NonNull::from_ref 等等。都是些能实实在在提升生产力的好玩意儿。

总而言之,Rust 1.89 是一个承上启下的版本。它既宣告了一个硬件时代的终结,又在软件层面让开发体验变得更加人性化、更不容易犯错。

那个曾经因为生命周期而把你虐得死去活来的 Rust,正在变得越来越“慈眉善目”。


关注梦兽编程微信公众号,解锁更多黑科技