Rust 1.89.0发布

208 阅读6分钟

Rust 团队宣布 Rust 的新版本 1.89.0。Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。

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

$ rustup update stable

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

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

1.89.0 稳定版的新特性

  1. 显式推断 const 泛型的参数

Rust 现在支持 _ 作为 const 泛型参数的参数,从周围的上下文中推断该值:


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

类似于""作为类型被允许的规则,当在签名中时,""不被允许作为const泛型的参数。


// 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>();

  1. 生命周期语法不匹配的lint

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

// 返回的类型 std::slice::Iter 具有生命周期,
// 但没有视觉指示表明这一点。
//
// 生命周期省略推断返回类型的生命周期与 scores 的生命周期相同。
fn items(scores: &[u8]) -> std::slice::Iter<u8> {
	scores.iter()
}

像这样的代码现在默认会产生警告:


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_idioms lint group 的一部分,但是关于 elided_lifetimes_in_paths lint 的强烈反馈表明,它过于粗暴,因为它会警告那些对理解函数而言无关紧要的生命周期:

use std::fmt;

struct Greeting;

impl fmt::Display for Greeting {
	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
		// -----^^^^^^^^^ expected lifetime parameter
		// 知道 Formatter 有一个生命周期并不能帮助程序员
		"howdy".fmt(f)
	}
}

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

  • 生命周期省略推断规则将输入生命周期连接到输出生命周期
  • 从语法上看不明显生命周期存在

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

自证有生命周期允许生命周期省略推断生命周期例子
ContainsLifetime
&T, &'_ T, ContainsLifetime<'_>
&'a T, ContainsLifetime<'a>

mismatched_lifetime_syntaxes lint 检查函数的输入和输出是否属于同一组。 对于上面最初的动机示例,&[u8] 属于第二组,而 std::slice::Iter 属于第一组。 我们说第一组中的生命周期是隐藏的。

由于输入和输出生命周期属于不同的组,因此 lint 将警告此函数,从而减少对何时值具有非视觉上明显的有意义的生命周期的困惑。

mismatched_lifetime_syntaxes lint 取代了 elided_named_lifetimes lint,后者专门为命名的生命周期做了类似的事情。

未来对 elided_lifetimes_in_paths lint 的工作计划将其拆分为更集中的子 lint,着眼于最终警告其中的一部分。

  1. 更多 x86 目标特性

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

#[target_feature(enable = "avx512bw")]
pub fn cool_simd_code(/* .. */) -> /* ... */ {
    /* ... */
}
  1. 跨平台编译的文档测试

现在,当运行 cargo test --doc --target other_target 时,文档测试将会被测试。这可能会导致一些破坏,因为原本会失败的文档测试现在会被测试。

可以通过使用 ignore- 注解文档测试来禁用失败的测试(文档):

/// ```ignore-x86_64  
/// panic!("something")  
/// ```
pub fn my_function() { }
  1. extern "C" 函数中的 i128 和 u128

i128 和 u128 不再触发 improper_ctypes_definitions lint,这意味着这些类型可以在 extern "C" 函数中使用而不会出现警告。但需要注意以下几点:

  • 当类型可用时,Rust 类型在 C 中与(无符号)__int128 在 ABI 和布局上兼容。
  • __int128 不可用的平台上,i128 和 u128 不一定与任何 C 类型对齐。
  • i128 不一定与任何平台上的 _BitInt(128) 兼容,因为 _BitInt(128)__int128 可能没有相同的 ABI(例如在 x86-64 上)。

这是去年布局更改的最后一点后续:blog.rust-lang.org/2024/03/30/…

  1. 将 x86_64-apple-darwin 降级为具有主机工具的 Tier 2

GitHub 即将停止为公共存储库提供免费的 macOS x86_64 runners。苹果也宣布了他们停止支持 x86_64 架构的计划。

根据这些变化,Rust 项目正在将 x86_64-apple-darwin 目标从具有主机工具的 Tier 1 降级为具有主机工具的 Tier 2。这意味着该目标(包括 rustc 和 cargo 等工具)将保证可以构建,但不保证通过我们的自动化测试套件。

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

对于用户而言,此更改不会立即产生影响。标准库和编译器的构建仍将由 Rust 项目分发,以便通过 rustup 或其他安装方法使用,而目标仍保持在 Tier 2。随着时间的推移,对此目标的测试覆盖率降低可能会导致出现问题或与不再兼容,而不会另行通知。

  1. wasm32-unknown-unknown 目标上符合标准的 C ABI

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

  1. 平台支持
  • x86_64-apple-darwin 正在降级为具有主机工具的 Tier 2
  • 添加新的 Tier-3 目标 loongarch32-unknown-none 和 loongarch32-unknown-none-softfloat

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