找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1757

积分

0

好友

263

主题
发表于 3 天前 | 查看: 905| 回复: 0

近期,Rust 1.92.0 已于 2025 年 12 月 11 日正式发布。本次更新聚焦于语言细节的打磨、标准库的完善以及工具链体验的优化,带来了一系列值得关注的稳定化改进。

Rust 1.92.0 发布概览

升级到此版本,可使用以下命令:

rustup update stable

如果尚未安装 rustup,可从 Rust 官网获取安装器,并查看 1.92.0 的详细发布说明

以下是该版本的核心亮点解析。

“Never Type” (!) 的稳定化铺垫

Rust 团队持续推进 !(从不返回类型)的稳定化工作。在 1.92.0 中,两个关键的未来兼容性 Lint 已被设为默认拒绝(deny-by-default):

  • never_type_fallback_flowing_into_unsafe
  • dependency_on_unit_never_type_fallback

在旧版本中,当编译器无法推断某些类型时,会默认回退到 ()(单元类型)。为了将来能安全地将回退目标改为 !,编译器现在要求开发者显式处理这些模糊情况,以避免未来版本中出现意外的行为变更。

这意味着,如果你的代码触发了这些 Lint,将直接导致编译错误(此前仅为警告)。此变更仅影响当前正在构建的 crate,作为依赖项引入时仍只产生警告。若代码受影响,建议通过显式类型标注来修复;若暂时无法修改,可使用 #[allow(...)] 属性显式允许这些 Lint。

优化 unused_must_use 对永不失败 Result 的处理

Rust 的 unused_must_use Lint 会对忽略带有 #[must_use] 注解的函数或类型(如 Result)返回值的行为发出警告。

然而,有些函数返回的 Result 使用了“不可实例化”的错误类型(如 !std::convert::Infallible),这意味着该操作在理论上不可能失败。从 Rust 1.92.0 起,忽略以下类型的返回值将不再触发警告:

  • Result<(), UninhabitedType>,例如 Result<(), Infallible>
  • ControlFlow<UninhabitedType, ()>

示例:

use core::convert::Infallible;
fn can_never_fail() -> Result<(), Infallible> {
    Ok(())
}
fn main() {
    can_never_fail(); // Rust 1.92.0 起,无警告
}

这一改进在处理 trait 中关联错误类型的常见模式时尤其有用,使得调用那些已知不会失败的方法时,无需再强制使用 .unwrap().expect()

Linux 上 -Cpanic=abort 的堆栈回溯功能修复

Rust 1.23 中,出于性能考虑,编译器在 -Cpanic=abort 模式下默认不再生成展开表(unwind tables),这导致了堆栈回溯功能失效。Rust 1.45 虽然引入了 -Cforce-unwind-tables=yes 作为变通方案,但需要手动添加。

Rust 1.92.0 修复了此问题。 现在,即使在 -Cpanic=abort 模式下,默认也会生成 unwind tables。当程序崩溃时,能够获得完整的调用栈信息,极大方便了问题定位。如果为了追求最小二进制体积而希望禁用此行为,需要显式使用 -Cforce-unwind-tables=no。此改动也有助于 perf 等性能分析工具更准确地获取调用栈。

更严格的 #[macro_export] 属性验证

编译器近期在改进内置属性的错误处理一致性。在 1.92.0 中,#[macro_export] 属性对其参数的合法性检查变得更加严格,并以“默认拒绝”的 Lint 形式报告,该检查甚至会应用于依赖项中。此举旨在统一所有内置属性的错误处理逻辑。

新稳定 API 一览

Rust 1.92.0 稳定了以下新 API:

  • NonZero<u{N}>::div_ceil
  • Location::file_as_c_str
  • RwLockWriteGuard::downgrade (重点功能,见下文)
  • Box::new_zeroed, Box::new_zeroed_slice
  • Rc::new_zeroed, Rc::new_zeroed_slice
  • Arc::new_zeroed, Arc::new_zeroed_slice
  • btree_map::Entry::insert_entry
  • btree_map::VacantEntry::insert_entry
  • proc_macro::TokenStream 实现了一系列 Extend trait。

以下先前稳定的 API 现在可在 const 上下文中使用:

  • <[_]>::rotate_left
  • <[_]>::rotate_right

注意:涉及“zeroed”内存初始化的接口通常有额外的安全约束,建议以标准库文档为准。

核心亮点:RwLockWriteGuard::downgrade 实现锁降级

RwLockWriteGuard::downgrade 的稳定是本次更新的一大亮点。它实现了锁降级操作:将持有的“写锁”(独占访问)原子性地降级为“读锁”(共享访问),而不释放锁

并发编程场景中,这是非常有用的优化。以往,若线程在修改数据后需要以只读方式继续使用数据,必须“先释放写锁,再获取读锁”。这个空窗期内,其他线程可能“插队”获取写锁并再次修改数据,破坏当前线程的读取一致性。

downgrade 方法通过原子操作直接降级,中间不释放锁,确保了降级前后数据视图的一致性。

use std::sync::{RwLock, RwLockWriteGuard};
fn main() {
    let config = RwLock::new("Default Config".to_string());
    // 获取写锁,修改数据
    let mut w_guard = config.write().unwrap();
    *w_guard = "New Config".to_string();
    println!("配置已修改。");
    // 关键步骤:原子性降级为读锁,保持锁定状态
    let r_guard = RwLockWriteGuard::downgrade(w_guard);
    // 此时,w_guard 被消耗,r_guard 持有读锁。
    // 其他读线程可以并行访问,但写线程仍被阻塞。
    println!("当前配置是: {}", *r_guard);
    // r_guard 离开作用域,锁被释放
}

文档搜索与构建指南优化

Rustdoc 的搜索功能变得更加智能。例如,当搜索结果包含某个 trait 定义的方法时,会自动隐藏具体实现该 trait 的类型中的同名方法,使搜索结果更清晰。搜索 “last” 将优先显示 Iterator::last,而非所有迭代器实现的 last 方法。

此外,Cargo 新增了关于“构建性能优化”的官方指南章节,为希望加快项目编译速度的开发者提供了实用参考,这也是系统编程和大型项目管理中常见的优化需求。

总结

Rust 1.92.0 并非一个功能爆炸的版本,其重点在于“偿还技术债务”与体验优化:为 ! 类型稳定化清理道路,优化了永不失败 Result 的处理体验,修复了 Linux 下的长期调试痛点。同时,也带来了 RwLockWriteGuard::downgrade 等极为实用的 API,并持续完善文档与工具链,进一步提升开发者的生产力与调试效率。




上一篇:SSH工具全解析:网络工程师必备的8款SecureCRT替代方案
下一篇:C++与Rust中的视图(View)模式:零拷贝数据访问的系统编程实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 19:13 , Processed in 0.173299 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表