AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。
Rust 1.96.0 正式发布
如果你已经通过 rustup 安装了旧版本的 Rust,可以通过以下命令获取 1.96.0 版本:
$ rustup update stable如果你尚未安装 rustup,可以从官方网站的相应页面下载。同时,欢迎查看 1.96.0 的详细发布说明。
另外,如果你想协助我们测试未来的版本,可以考虑将本地环境更新为 beta 频道(rustup default beta)或 nightly 频道(rustup default nightly)。如果在使用过程中遇到任何 Bug,请务必向我们报告!
Rust 1.96.0 稳定版有哪些新特性
全新的 Range* 类型
许多开发者期望 Range 及相关的 core::ops 类型能够实现 Copy trait,但事实并非如此:它们直接实现了 Iterator。在同一个类型上同时实现 Iterator 和 Copy 往往是一个“雷区”(footgun),因此此前一直被避免。
为了解决这个问题,RFC3550 提出了一组替代的范围类型,它们实现的是 IntoIterator 而非 Iterator,这意味着它们可以安全地实现 Copy。目前,该 RFC 的标准库部分已正式稳定,引入了以下新类型:
core::range::Range
core::range::RangeFrom
core::range::RangeInclusive
Associated iterators
在不久的将来,Rust 还会将 core::range::RangeFull 和 core::range::RangeTo 作为 core::ops 的重新导出添加进来(这些类型并未实现 Iterator,且已经实现了 Copy),并引入 core::range::legacy::* 作为当前范围类型的新归宿。需要注意的是,像 0..1 这样的范围语法目前仍会产生旧版类型,但在未来的 Edition 中将会更新为 core::range 类型。
借助这些稳定的特性,我们现在可以直接将切片访问器存储在 Copy 类型中,而无需将起始和结束位置拆分存储。来看一个具体的例子:
use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range<usize>);
impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
}此外,新的 RangeInclusive 还将其字段设为公开,这与避免暴露耗尽的迭代器状态的旧版有所不同。由于新类型必须经过转换才能开始迭代,因此这不再是一个令人担忧的问题。
库的作者们应注意,在公开 API 中优先使用 impl RangeBounds,因为它可以同时兼容旧版和全新的范围类型。如果需要使用具体类型,建议优先使用新的范围类型,因为它们最终将成为默认标准。
断言匹配模式 (Assert matching patterns)
全新的宏 assert_matches! 和 debug_assert_matches! 用于检查某个值是否匹配给定的模式。如果不匹配,程序将会 panic 并打印出该值的 Debug 表示。它们在功能上与 assert!(matches!(..)) 和 debug_assert!(matches!(..)) 基本一致,但由于打印出了具体的值,大大提高了诊断失败原因的可能性。
需要注意的是,这些新宏并未添加到标准 prelude 中,因为它们会与提供同名宏的流行的第三方 crate 发生冲突。在使用前,需要手动从 core 或 std 中导入它们。代码示例如下:
use core::assert_matches;
/// [Random Number](https://xkcd.com/221/)
fn get_random_number() -> u32 {
// chosen by a fair dice roll.
// guaranteed to be random.
4
}
fn main() {
assert_matches!(get_random_number(), 1..=6);
}WebAssembly 目标平台的变更
WebAssembly 目标平台不再将 --allow-undefined 传递给链接器。这意味着链接时如果出现未定义的符号,将会直接触发链接错误,而不是将其转换为来自 "env" 模块的 WebAssembly 导入。
这一变更要求模块必须定义所有与链接相关的符号才能完成链接。这有助于更早地捕获 Bug,并防止因符号命名等导致的意外问题。
通常情况下,未定义的链接符号往往暗示着构建时的 Bug 或配置错误。但是,如果你确实需要旧行为,可以通过设置环境变量 RUSTFLAGS=-Clink-arg=--allow-undefined 来重新启用,或者修改源码,在定义该符号的块上使用 #[link(wasm_import_module = "env")]。
此变更此前已在官方博客上公布,现在在 Rust 1.96 中正式生效。
稳定的 API
assert_matches!
debug_assert_matches!
From for AssertUnwindSafe
From for LazyCell
From for LazyLock
core::range::RangeToInclusive
core::range::RangeToInclusiveIter
core::range::RangeFrom
core::range::RangeFromIter
core::range::Range
core::range::RangeIter
两项 Cargo 安全建议
Rust 1.96 针对使用第三方注册表的用户,修复了两个安全漏洞:
CVE-2026-5223:一个中等严重程度的漏洞,涉及使用符号链接解压 crate tarballs 的问题。
CVE-2026-5222:一个低严重程度的漏洞,涉及使用规范化 URL 进行身份验证的问题。
需要注意的是,使用 crates.io 的用户不受上述两个漏洞的影响。
其他变更
此外,Rust、Cargo 和 Clippy 还有一些其他细微的变动,欢迎查看完整的变更记录。
致谢 1.96.0 的贡献者
Rust 1.96.0 的发布离不开众多开发者的共同努力。感谢每一位贡献者的辛勤付出!
游客
- 一字一句需斟酌,一言一语显风范。
- 评论消耗5积分,点赞、收藏消耗3积分。
AI 中文社