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)
}
}
我们随后意识到,我们想要消除的困惑发生在以下两种情况同时发生时:
- 生命周期省略推理规则将输入生命周期与输出生命周期关联起来。
- 从语法角度来看,生命是否存在这一点并不显而易见。
Rust 语法中有两种表示生命周期的语法:[i]``&和[i] ',其中[i]``'又细分为推断生命周期'_和命名生命周期'a。当类型使用命名生命周期时,生命周期省略将不会为该类型推断生命周期。基于这些标准,我们可以构建三个组:
| 不言而喻,它有其生命周期。 | 允许省略生命周期以推断生命周期 | 示例 |
|---|---|---|
| 不 | 是的 | ContainsLifetime |
| 是的 | 是的 | &T,,&'_ TContainsLifetime<'_> |
| 是的 | 不 | &'a T,ContainsLifetime<'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
-
这里未列举许多 x86 的内部函数。
这些先前稳定的 API 现在在 const 上下文中也保持稳定:
其他变化
1.89.0 版本的贡献者
Rust 1.89.0 的开发离不开许多人的共同努力。没有你们,我们不可能完成这项工作。谢谢!