Rust 1.92.0 稳定版已正式发布。这个版本并没有带来重大变化和主要新功能,而是一个较为保守的版本,它只是巧妙地调整和优化了语言规范和编译器工具链等。其中最引人注目的是为最终稳定化"Never Type"所做的准备,改善了对Linux平台调试体验,以及完善文档与调试能力。

下面介绍一下 Rust 1.92.0 的主要内容:涉及语言核心、编译器和标准库层面的一系列更新。
语言特性与编译器更新
1、语言核心:向 Never 类型的最终稳定化迈进
语言和编译器团队继续推进 Never 类型的稳定化工作。为了推进Never类型( ! )(表示永远不会返回的类型)的最终稳定化,在此版本中,编译器团队将 never_type_fallback_flowing_into_unsafe 和 dependency_on_unit_never_type_fallback 这两个相关的未来兼容性提示(lint)提升为 Deny-by-default (默认为拒绝) 级别。当编译器检测到可能因 Never 类型类型回退规则变化而受损的代码时,这两个lint 将触发编译错误 ,而非警告,这显然是编译器团队有意让开发者更加关注 Never 类型而做出的做铺垫工作(不过,铺垫归铺垫,因为 never!这个关键字起得太过玄学,难怪网友调侃:我们都知道"永不"类型的真正稳定日期😉)。
不过此更改仅在直接构建受影响的 crate 时生效;如果这些 crate 是作为依赖项被构建,则不会触发错误。虽然开发者可以通过 #[allow(...)] 属性暂时绕过这些错误,但官方强烈建议修复被报告的问题。
此外,unused_must_use lint 变得更加智能。对于返回类型为 Result<(), !> 或 ControlFlow<!, ()> 的函数,该lint将不再发出"未使用必须使用的值"的警告。
2、编译器方面:Linux 下 panic=abort 问题修复
在编译器方面,Rust 1.92.0 解决了一个长期影响Linux开发者调试体验的问题。
过去,当使用 -C panic=abort 编译选项(即在panic 时直接终止程序而非展开)时,编译器默认不会生成展开表(unwind tables) ,这导致无法获取有意义的栈回溯信息(backtrace)。
从这个版本开始,即使在Linux上使用 -C panic=abort,编译器也会默认生成展开表(unwind tables)。这意味着程序异常(panic )终止时,开发者能够获得准确的函数调用栈信息(backtrace),极大地便利了线上问题的调试和诊断。
当然,如果出于极致的二进制体积优化考虑,开发者仍可以通过 -C force-unwind-tables=no 选项显式关闭此功能。
3、宏导出参数校验:
对 #[macro_export] 属性的参数输入进行了更严格的校验,invalid_macro_export_arguments lint 现在默认拒绝(deny)。
4、Lint 改进:
unused_must_use lint 现在更加智能,不再对返回Result<(), Uninhabited>(例如 Result<(), !>)的函数发出警告,因为这种情况下错误分支在逻辑上是不可能发生的。
标准库:实用的新API与零开销抽象
Rust 1.92.0 在标准库中稳定了一批新的API,涵盖了内存操作、并发控制和数据结构等多个方面。
零初始化智能指针: 这是本次更新的一个亮点。新增的 Box::new_zeroed、Box::new_zeroed_slice 以及对应的 Rc 和 Arc 版本,允许开发者直接创建内存内容为零的智能指针。
这在处理需要清零内存的FFI(外部函数接口)交互或对安全性有极高要求的场景中非常有用。
在并发编程方面: RwLockWriteGuard::downgrade 方法现已稳定。它允许开发者将一个写锁"降级"为一个读锁,而无需先释放写锁再竞争读锁。
这个原子性操作对于需要先修改数据、再以只读方式长时间持有访问权的场景至关重要,能有效避免不必要的锁竞争。
其它值得关注的稳定API还包括:
NonZero<uN>::div_ceil:对非零整数进行向上取整的除法。Location::file_as_c_str:获取当前源代码文件名的C字符串表示,便于与C语言交互。BTreeMap的入口API扩展:如btree_map::Entry::insert_entry。- 为
proc_macro::TokenStream实现了对Group、Literal等类型的Extendtrait,增强了过程宏编写的灵活性。
此外,切片的 rotate_left 和 rotate_right 方法现在可以在常量上下文(const context)中使用了。
工具链 :更智能的文档搜索与构建指南
Rust 的工具链(Rustdoc & Cargo)在此版本中也获得了实用性改进。
Rustdoc(文档工具)的搜索功能 变得更加智能和友好。
- 搜索结果去重 :当搜索结果中包含某个trait定义的方法时,Rustdoc会自动隐藏那些具体实现该trait的类型中的同名方法。例如,搜索"last"将主要显示
Iterator::last,而不会用各个迭代器实现的last方法刷屏,使得像BTreeSet::last这样的固有方法更容易被找到。 - 放宽搜索词限制:现在可以搜索不完全符合Rust标识符规则的词(例如以数字开头的词条),从而提升了搜索体验。
Cargo 新增了关于 "构建性能优化"的官方文档章节。这对于想要加快项目编译速度的开发者而言,是一个很实用的参考。
Rust 版本升级指南
升级到 Rust 1.92.0 非常简单,只需在终端执行以下命令:
shell
rustup update stable
对于实际项目,建议先在持续集成(CI)环境中测试升级,确保新的默认拒绝 lint(如 invalid_macro_export_arguments)不会中断构建。根据官方说明,最低支持的LLVM版本已更新至20。
总结
Rust 1.92.0正式发布,核心改进包括 Never 类型稳定化准备、Linux下 panic 回溯修复,以及智能指针零初始化等标准库 API 落地等。