Rust 编程语言长期使用 never 类型(``!``)来标记永不存在的值——例如永不返回的函数的返回类型,或可证明不可达分支中的值。多年来,该类型被视为不稳定特性,仅在夜间构建版本中通过特性开关可用。2026 年 8 月 24 日,在经过两年多的工作后,Rust 编译器贡献者 "waffle" 合并了拉取请求 rust‑lang/rust#155499,将 never 类型在所有 Rust 版本中稳定化,自 Rust 1.100 起生效。
语言文档中使用的稳定 Rust 标志,代表 Rust 1.100 中的 never 类型稳定化。
此次稳定化带来了两个影响泛型代码和特征实现的具体变化。首先,never 类型的回退行为被修改:在此次更改之前,当编译器无法推断具体类型时,会回退到单元类型 ``()``(其唯一值是 ``()``)。新行为回退到 ``!`` 本身,这意味着以前在旧回退下编译的代码现在可能需要显式类型注解。其次,标准库类型 ``Infallible``——此前是一个独立的无值类型,用于作为不稳定 never 类型的变通方案——现在被定义为 ``!`` 的类型别名。此别名让优化器保留 ``!`` 的强制转换优势,同时让现有通过名称引用 ``Infallible`` 的代码继续编译。
GitHub open‑graph image for the PR that introduced the never type stabilization, showing the PR title and comments.
这些变更并非没有影响。Rust 维护者对 crates.io 上所有公开可用的 crate 运行了 crater 工具,发现 3 300 个 crate 出现了某种回归。其中 7 个 crate 完全损坏,1 553 个通过对依赖旧回退行为的核心库进行回溯修复而修复。剩余的 crate 要么已有显式类型说明,要么可以继续使用旧版 Rust(1.99),直到其依赖项更新。
对库作者和应用开发者而言,实际后果很清楚:依赖 never 类型回退到 ``()`` 的代码需要显式返回类型或小幅补丁。Rust 团队直接与许多维护者合作提供了回溯补丁,一般建议是如果变更破坏了关键依赖则继续使用 Rust 1.99,或者更新受影响库到修复版本。大多数日常 Rust 用户不会注意到任何差异,因为 never 类型主要用于泛型和特征级别代码。
never 类型本身有两个主要用途。实际原因是实现更高效的泛型代码——例如 ``FromStr`` 特征可以在转换永不失败时将其 ``Err`` 关联类型设为 ``!``,让编译器完全丢弃错误分支。哲学原因是为类型推断器提供一种统一方式来处理无限循环表达式和其他永不产生值的构造;``!`` 会自动强制转换为任何其他类型,编译器可利用这一点进行死代码消除等优化。
实际使用中,开发者会在泛型签名、特征实现和 ``Result`` 类型中看到 ``!``,其中错误变体已知不可能发生。稳定化还意味着 ``Infallible`` 可以与 ``!`` 互换使用,尽管显式命名 ``Infallible`` 的代码将继续无需修改地工作。
总体而言,never 类型的稳定化标志着 Rust 向更可预测和可优化的类型系统迈出了重要一步,同时伴随的回退和 ``Infallible`` 变更旨在以最小破坏推动生态持续前进。