你有没有遇到过这种情况?写个字符串处理函数,为了取窗口里的四个字节,又是下标访问,又是边界检查,写到最后自己都看不懂自己写了啥。

我之前就是这样的,直到我看到了 Rust 1.94。

滑动窗口直接"拆快递"

3 月 5 号发布的 Rust 1.94,给我们带来了一个超级好用的新玩具:array_windows()

以前你想检查一个字符串里有没有"ABBA"这种回文模式,得这么写:

fn has_abba_old(s: &str) -> bool {
    s.as_bytes()
        .windows(4)
        .any(|w| w[0] != w[1] && w[0] == w[3] && w[1] == w[2])
}

看到 w[0]、w[1]、w[2]、w[3] 是不是有点晕?这还算短的,复杂场景下你能写出一排 w[n]

现在有了 array_windows(),世界清净了:

fn has_abba(s: &str) -> bool {
    s.as_bytes()
        .array_windows()
        .any(|[a1, b1, b2, a2]| (a1 != b1) && (a1 == a2) && (b1 == b2))
}

编译器会自动推断窗口大小——你只需要在闭包里写出想要几个变量,它就给你拆成几个。[a1, b1, b2, a2] 这种写法,四个变量名写得明明白白,比 w[0]、w[1] 这种神秘数字友好一百倍。

windows vs array_windows 对比

而且因为是固定大小的数组,编译器能直接做边界检查优化,代码既安全又漂亮。

这功能对刷算法题的人来说太友好了。滑动窗口相关的题目在 LeetCode 和 Advent of Code 里特别多,以前要折腾半天的下标操作,现在一行就搞定。

Cargo.toml 终于可以"换行"了

第二个更新可能影响面更广:TOML 1.1 来了。

以前 Cargo.toml 里的内联表必须挤在一行里,像这样:

serde = { version = "1.0", features = ["derive"] }

一个依赖字段多的话,那一行能写到天上去。

现在好了,TOML 1.1 支持多行内联表:

contact = {
    personal = {
        name = "Donald Duck",
        email = "donald@duckburg.com",
    },
    work = {
        name = "Coin cleaner",
        email = "donald@ScroogeCorp.com",
    },
}

舒服了。

不过有个坑要提醒一下:如果你在项目里用上 TOML 1.1 的新语法,那你的 MSRV(最低支持的 Rust 版本)就直接变成 1.94 了。这意味着帮你修 bug 的贡献者们也得升级 Rust。当然,发布到 crates.io 的时候 Cargo 会自动帮你转成兼容旧版的格式,用户不受影响,但开发团队内部得同步升级。

十年等待:黄金分割率终于来了

最后这个更新虽然不起眼,但真的等了好久。

Rust 标准库之前就有 PI、E、TAU 这些数学常量,但 GOLDEN_RATIO(φ ≈ 1.6180)和 EULER_GAMMA(γ ≈ 0.5772)愣是等了十年才加进来。

use std::f64::consts::{GOLDEN_RATIO, EULER_GAMMA};

println!("φ = {}", GOLDEN_RATIO);  // 1.618033988749895
println!("γ = {}", EULER_GAMMA);   // 0.5772156649015329

这两个常数有多经典不用我多说了吧。黄金分割在斐波那契数列、螺旋图案、UI 布局里到处可见;欧拉-马歇罗尼常数在数论和概率分布里是常客。之前想用还得自己定义或者拉个第三方库,现在终于圆满了。

还有啥值得关注的

简单提几个其他更新:

  • trait 的 dead_code lint 现在会继承到实现上
  • 29 个 RISC-V 目标特性稳了,包括 RVA22U64/RVA23U64 的大部分功能
  • Unicode 17 支持
  • LazyCellLazyLock 多了 getget_mutforce_mut 方法

怎么更新

一行命令的事:

rustup update stable

然后 rustc --version 确认一下是 1.94.0 就 OK 了。


总结

Rust 1.94 这三个更新虽然不算"炸裂",但都很实用。滑动窗口解构让代码更易读,TOML 多行表让配置文件终于能看,数学常量则补上了标准库的缺口。升级不亏,赶紧整起来。

顺便分享一个我常用的 AI自媒体运营工具 ,覆盖内容排版、素材处理和效率提效。

最近在玩 Claude Code 的新功能,发现官方出了个 Codex 增强版门户 ,把各种智能编程能力整合在一起了。

如果你想看到更多这类工具测评,欢迎关注我的公众号「梦兽编程」,每周更新。


FAQ

Q: array_windows 和 windows 有什么区别?

A: windows(4) 返回的是 &[T],需要用下标访问;array_windows() 返回的是 &[T; N],可以直接解构成 [a, b, c, d] 这种命名变量。编译器还能根据你的解构模式自动推断窗口大小,代码更安全。

Q: 使用 TOML 1.1 新特性有什么风险?

A: 主要风险是提高了项目的 MSRV。如果你的项目依赖第三方库,而它们还没升级到 Rust 1.94,就可能出问题。建议评估后再开启新语法。

Q: GOLDEN_RATIO 和 EULER_GAMMA 有什么用?

A: GOLDEN_RATIO 常用于 UI 设计、图像处理、斐波那契数列相关计算;EULER_GAMMA 主要用在数论、概率论和调和级数分析中。普通业务代码很少直接用到,但做底层计算或科学计算时很方便。

滑动窗口工作原理