AI 中文社区(简称 AI 中文社),是国内学习交流AI人工智能技术的中文社区网站,这里可获取及贡献任何AI人工智能技术,我们追求自由、简洁、纯粹、分享的多元化人工智能社区。

Rust 1.96.0 正式发布

Rust · 杰作 55分前发布 · 浏览6次 · 点赞0次 · 收藏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 的发布离不开众多开发者的共同努力。感谢每一位贡献者的辛勤付出!

Rust 1.96.0 正式发布 - Rust - 话题 - AI 中文社区
点赞(0) 收藏(0)
0条评论
现在评论,你将成小区里最靓的仔^_^
评论
游客
游客
登录后再评论
  • 一字一句需斟酌,一言一语显风范。
  • 评论消耗5积分,点赞、收藏消耗3积分。