Rust : 新版本 1.89.0

原文

2025年8月7日 · Rust 发布团队

Rust 团队很高兴地宣布推出 Rust 新版本 1.89.0。Rust 是一种编程语言,它使每个人都能构建可靠高效的软件。

如果您之前通过 apt 安装了 Rust 的旧版本rustup,则可以使用以下命令获取 1.89.0 版本:

ruby 复制代码
$ rustup update stable

如果您还没有,您可以从我们网站上的相应页面获取rustup,并查看1.89.0 的详细发行说明

如果您想帮助我们测试未来的版本,可以考虑在本地更新到 beta 版(rustup default beta)或 nightly 版(rustup default nightly)。请报告您遇到的任何错误!

1.89.0 稳定版包含哪些内容?

显式推断常量泛型的参数

Rust 现在支持_const 作为泛型参数的参数,并从上下文推断其值:

rust 复制代码
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
  [false; _]
}

_与允许将其作为类型使用的规则类似,_当在签名中时,不允许将其作为常量泛型的参数:

rust 复制代码
// This is not allowed
pub const fn all_false<const LEN: usize>() -> [bool; _] {
  [false; LEN]
}

// Neither is this
pub const ALL_FALSE: [bool; _] = all_false::<10>();
  • 这是给 const 泛型加的"表达式位置的下划线推断"糖衣语法。

  • 之前必须重复写常量(如 LEN),现在在实现体的一些地方可以写"_",由编译器从类型/上下文推断,减少样板与错误。

  • 但在签名等声明处仍必须显式写出常量,保证 API 的清晰性与可读性。

生命周期语法不匹配 lint、

函数签名中的生命周期省略是 Rust 语言的一个符合人体工程学的特性,但它也可能成为新手和专家都可能遇到的绊脚石。当类型中生命周期被推断出来,而语法上又不明显表明存在生命周期时,这种情况尤其如此:

rust 复制代码
// The returned type `std::slice::Iter` has a lifetime, 
// but there's no visual indication of that.
//
// Lifetime elision infers the lifetime of the return 
// type to be the same as that of `scores`.
fn items(scores: &[u8]) -> std::slice::Iter<u8> {
   scores.iter()
}

现在,类似这样的代码默认会产生警告:

rust 复制代码
warning: hiding a lifetime that's elided elsewhere is confusing
 --> src/lib.rs:1:18
  |
1 | fn items(scores: &[u8]) -> std::slice::Iter<u8> {
  |                  ^^^^^     -------------------- the same lifetime is hidden here
  |                  |
  |                  the lifetime is elided here
  |
  = help: the same lifetime is referred to in inconsistent ways, making the signature confusing
  = note: `#[warn(mismatched_lifetime_syntaxes)]` on by default
help: use `'_` for type paths
  |
1 | fn items(scores: &[u8]) -> std::slice::Iter<'_, u8> {
  |                                             +++

我们在 2018 年就尝试改进这种情况,当时我们参与了rust_2018_idiomslint 小组的工作,但关于lint强烈反馈elided_lifetimes_in_paths表明,这种方法过于简单粗暴,因为它警告的寿命对于理解功能来说并不重要:

rust 复制代码
use std::fmt;

struct Greeting;

impl fmt::Display for Greeting {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        //                -----^^^^^^^^^ expected lifetime parameter
        // Knowing that `Formatter` has a lifetime does not help the programmer
        "howdy".fmt(f)
    }
}

我们随后意识到,我们想要消除的困惑发生在以下两种情况同时发生时:

  1. 生命周期省略推理规则将输入生命周期与输出生命周期关联起来。
  2. 从语法角度来看,生命是否存在这一点并不显而易见。

Rust 语法中有两种表示生命周期的语法:[i]``&[i] ',其中[i]``'又细分为推断生命周期'_和命名生命周期'a。当类型使用命名生命周期时,生命周期省略将不会为该类型推断生命周期。基于这些标准,我们可以构建三个组:

不言而喻,它有其生命周期。 允许省略生命周期以推断生命周期 示例
是的 ContainsLifetime
是的 是的 &T,,&'_ TContainsLifetime<'_>
是的 &'a TContainsLifetime<'a>

代码检查工具mismatched_lifetime_syntaxes会检查函数的输入和输出是否属于同一组。对于上面最初的示例,a``&[u8]属于第二组,而 b``std::slice::Iter<u8>属于第一组。我们称第一组中的生命周期是隐藏的

因为输入和输出的生命周期属于不同的组,所以 lint 会对此函数发出警告,从而减少对某个值具有有意义的生命周期(但视觉上并不明显)时的困惑。

lintmismatched_lifetime_syntaxes取代了elided_named_lifetimeslint,后者专门针对命名的生命周期做了类似的事情。

未来对该代码检查工具elided_lifetimes_in_paths(lint)的改进计划是将其拆分为更专注的子代码检查工具,并最终针对其中一部分发出警告。

更多 x86 目标功能

target_feature属性现在支持x86 上的sha512``, sm3、`sm4,``kl和目标特性。此外,x86 上还支持widekl一些内部函数和目标特性:avx512`

rust 复制代码
#[target_feature(enable = "avx512bw")]
pub fn cool_simd_code(/* .. */) -> /* ... */ {
    /* ... */
}

交叉编译的文档测试

现在运行时会测试 doctest cargo test --doc --target other_target,这可能会导致一些故障,因为原本会失败的 doctest 现在也会被测试。

可以通过在 doctest 中添加ignore-<target>( docs ) 注解来禁用失败的测试:

csharp 复制代码
/// ```ignore-x86_64
/// panic!("something")
/// ```
pub fn my_function() { }

i128以及u128函数extern "C"

i128这样u128就不会再触发improper_ctypes_definitions代码检查,这意味着可以在函数中使用这些类型extern "C"而不会收到警告。但这也有一些需要注意的地方:

  • Rust 类型在 ABI 和布局上与__int128C 中的(无符号)类型兼容(当该类型可用时)。
  • 在某些平台上,__int128此功能不可用,i128并且u128不一定与任何 C 类型一致。
  • i128不一定与任何平台上的程序兼容,因为程序 和程序可能不具有相同的 ABI(例如在 x86-64 上的情况)。_BitInt(128)``_BitInt(128)``__int128

这是对去年布局更改的最后一部分后续说明:https ://blog.rust-lang.org/2024/03/30/i128-layout-update 。

使用主机工具降级x86_64-apple-darwin到二级

GitHub 即将停止为公共代码库提供免费的 macOS x86_64 运行器。苹果公司也已宣布计划停止对 x86_64 架构的支持。

根据这些变更,Rust 项目正在将目标平台包含宿主工具的 Tier 1降级x86_64-apple-darwin包含宿主工具的 Tier 2。这意味着包含诸如和 等工具的目标平台将保证能够构建,但不能保证能够通过我们的自动化测试套件。rustc``cargo

我们预计,将主机工具降级到 Tier 2 的 RFC 将在 Rust 1.89 和 1.90 版本之间被接受,这意味着 Rust 1.89 将是最后x86_64-apple-darwin一个 Tier 1 目标的 Rust 版本。

对于用户而言,此变更不会立即产生影响。rustup在目标平台仍处于 Tier 2 级别期间,Rust 项目仍将分发标准库和编译器的构建版本,供用户通过其他安装方式使用。随着时间的推移,该目标平台的测试覆盖率降低可能会导致一些问题或兼容性下降,届时将不会另行通知。

符合标准的 C ABIwasm32-unknown-unknown目标

extern "C"目标平台上的函数wasm32-unknown-unknown现在具有符合标准的 ABI。有关更多信息,请参阅此博客文章: https: //blog.rust-lang.org/2025/04/04/c-abi-changes-for-wasm32-unknown-unknown

平台支持

有关 Rust 分级平台支持的更多信息,请参阅 Rust 的平台支持页面。

稳定的API

这些先前稳定的 API 现在在 const 上下文中也保持稳定:

其他变化

来看看RustCargoClippy中发生了哪些变化。

1.89.0 版本的贡献者

Rust 1.89.0 的开发离不开许多人的共同努力。没有你们,我们不可能完成这项工作。谢谢!

相关推荐
星释3 小时前
Rust 练习册 100:音乐音阶生成器
开发语言·后端·rust
木易 士心9 小时前
Go、Rust、Kotlin、Python 与 Java 从性能到生态,全面解读五大主流编程语言
java·golang·rust
badmonster010 小时前
AI ETL需要不同的原语:从构建CocoIndex中学到的Rust经验🦀
rust·aigc
Source.Liu13 小时前
【Chrono库】Chrono 本地时区模块解析(src/offset/local/mod.rs)
rust·time
干饭比赛第一名获得者14 小时前
🚀 终极指南:Mac M4 编译 Rust 至 Linux (AMD64)
后端·rust
未来之窗软件服务15 小时前
幽冥大陆(三十六)S18酒店门锁SDK rust语言——东方仙盟筑基期
开发语言·c++·rust·智能门锁·东方仙盟sdk·东方仙盟一体化
ALex_zry16 小时前
C语言底层编程与Rust的现代演进:内存管理、系统调用与零成本抽象
c语言·算法·rust
ALex_zry16 小时前
内核开发者的视角:C与Rust在系统编程中的哲学与实践
c语言·开发语言·rust
u***451616 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
星释17 小时前
Rust 练习册 101:字符串序列切片的艺术
开发语言·后端·rust