在经历了十年的开发和五次失败的稳定化尝试后,Rust 团队在 1.100.0 版本中正式稳定了 'never' 类型(!)。这一变化允许开发者显式地表示发散计算——即永远不会解析为值的代码,例如总是返回或退出的函数——从而在复杂的控制流(如 `match` 分支)中实现更具表现力的类型检查。
'Never' 类型的稳定化
‘never’ 类型由 `!` 符号表示,代表永远不会解析为值的计算。虽然它以前在某些上下文中可用,但此版本允许它在任何地方命名,包括作为泛型参数或返回类型。
‘never’ 类型的一个关键特性是它可以强制转换为任何其他类型。这使得执行 `return` 的 `match` 分支即使在其他分支返回特定值的情况下也能通过类型检查,因为编译器将 `return` 视为向预期类型转换的有效路径。

此截图提供了新稳定 'never' 类型及其在语言中行为的具体代码示例。
为了支持这一点,团队将 2024 版之前的“never 类型回退”从 `()` 改为 `!`。虽然这在很大程度上是不可察觉的,但它可能会导致编译器检测到更多不可达代码,或影响涉及泛型参数的罕见情况。
自定义分配器与内存管理
Rust 1.100.0 通过稳定核心的 `Allocator` trait,标志着 Allocators 1.0 项目的一个重要里程碑。这使得库作者能够定义自定义内存分配策略,并直接与 `Vec` 和 `Box` 等标准库类型配合使用。
图表由 HN Digest 根据 blog.rust-lang.org 报告的数据绘制;数值按原文显示。
虽然这为自定义内存管理奠定了基础,但团队指出仍需更多工作来扩展 API 表面,并为更广泛的集合和指针类型稳定这些分配器。
供应链安全与 Cargo 改进
为了防止恶意软件包发布,Cargo 现在通过 `global-min-publish-age` 配置支持“依赖冷却”。这允许用户指定最小年龄(例如 3 天),在此之前 Cargo 将不会解析新发布的依赖版本。

此图像显示了供应链安全部分提到的“依赖冷却”功能的配置语法。
该版本还引入了对 `Cargo.toml` 中未使用的依赖的自动报告。这通过警告开发者那些包含在工作区中但未被任何构建目标使用的 crate,帮助他们保持构建配置的精简。
此外,Cargo 的构建目录布局经过重构,以一致地应用构建配置哈希。此更改旨在减少额外的重新构建,并解决不同配置共享文件导致缓存冲突的问题。
新工具:DropGuard 与 Conjuring ZSTs
新的 `core::mem::DropGuard` 辅助类型简化了“全有或全无”API 的创建。它接收一个变量和一个闭包,仅在 guard 被丢弃时运行闭包,同时提供一个 `dismiss` 方法,用于在不触发析构函数的情况下返回变量。

此截图展示了 DropGuard 辅助类型,它简化了“全有或全无”的事务式 API。
对于底层系统编程,该版本增加了 `std::mem::conjure_zst`。这提供了一种专门的、不安全的途径,在开发者确定操作安全时创建零大小类型(ZSTs),取代了诸如转换 `()` 或使用 `MaybeUninit` 等各种“咒语”。
Hacker News 读者的反应
- 亲身经验: 一位评论者分享说,他们最近不得不使用分配器 API 来修复特定库中的内存泄漏,并指出这些功能现在已在稳定版本中可用。 评论 ↗
- 亲身经验: 一位用户报告说,在 AI 辅助编程过程中更新到新版本后,该工具成功识别并删除了几个未使用的依赖。 评论 ↗
- 质疑: 一位读者对缓慢的编译时间以及在构建过程中产生的大量临时文件表示沮丧。 评论 ↗
- 疑问: 一位评论者质疑为什么某些预期的功能没有与 'never' 类型的稳定化一起包含在本次发布中。 评论 ↗
以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗