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 的开发离不开许多人的共同努力。没有你们,我们不可能完成这项工作。谢谢!

相关推荐
Pomelo_刘金2 小时前
Rust : Trusted Publishing(受信发布)
rust
Pomelo_刘金2 小时前
Rust :裸函数 naked functions
rust·嵌入式
猫头虎6 小时前
Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台)
java·开发语言·c++·python·golang·rust·排序算法
ftpeak6 小时前
Rust 嵌入式开发的经验之谈
开发语言·后端·rust
已黑化的小白17 小时前
Rust 的所有权系统,是一场对“共享即混乱”的编程革命
开发语言·后端·rust
John_Rey17 小时前
Rust类型系统奇技淫巧:幽灵类型(PhantomData)——理解编译器与类型安全
前端·安全·rust
John_Rey1 天前
Rust底层深度探究:自定义分配器(Allocators)——控制内存分配的精妙艺术
开发语言·后端·rust
勤奋的小小尘1 天前
第三篇: Rust 结构体、Trait 和方法详解
rust
isyuah1 天前
Rust Miko 框架系列(二):快速上手与基础示例
后端·rust