Rust 1.89.0 稳定版发布


Rust 1.89.0 稳定版已发布。主要变化包括:

  • 新增 x86 特性:新增了更多 AVX-512 intrinsics,并扩展了 target_feature 属性支持一系列新的 x86/x86_64 指令集扩展,包括 SHA512、SM3、SM4、KL 和 WIDEKL 等 。
  • 语法和语言改进
    • 支持对常量泛型参数的显式推导(generic_arg_infer)正式稳定。

    • 引入一个默认启用的 lint:mismatched_lifetime_syntaxes,用于提醒函数签名中不同生命周期语法之间可能引起混淆的情况,取代了之前的 elided_named_lifetimes lint。


以下内容转载自:https://mp.weixin.qq.com/s/8bdp0wCVj5narHSoMf4-hQ

1.89.0 稳定版的新特性

显式推断的常量泛型参数

Rust 现在支持将 _ 用作常量泛型参数的一个参数,编译器会从周围的上下文推断该值:

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

类似于 _ 作为类型参数的使用规则,当在函数签名中使用 _ 作为常量泛型的参数时,编译器会拒绝:

// 这是不允许的
pub const fn all_false<const LEN: usize>() -> [bool; _] {
  [false; LEN]
}

// 这个也不允许
pub const ALL_FALSE: [bool; _] = all_false::<10>();

不匹配的生命周期语法警告

函数签名中的生命周期省略是 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 组来改善这个问题,但对于 elided_lifetimes_in_paths lint 的强烈反馈表明,这个 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)
    }
}

我们意识到,造成困惑的情况出现在以下两种情况下:

  1. 生命周期省略推断规则将输入生命周期与输出生命周期连接在一起

  2. 没有语法上明显的生命周期存在

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

自显生命周期

允许省略生命周期推断

示例

ContainsLifetime

&T

&'_ TContainsLifetime<'_>

&'a T

ContainsLifetime<'a>

mismatched_lifetime_syntaxes lint 检查函数的输入和输出是否属于同一组。上述初始示例中,&[u8] 属于第二组,而 std::slice::Iter<u8> 属于第一组,因此它们的生命周期是“隐藏的”。由于输入和输出的生命周期属于不同的组,lint 会发出警告,减少对生命周期存在但视觉上不明显的困惑。

更多 x86 目标特性

target_feature 属性现在支持 sha512sm3sm4kl 和 widekl 等 x86 目标特性。此外,x86 上还支持一些 AVX512 内在特性和目标特性:

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

跨编译文档测试

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

失败的测试可以通过在文档测试中使用 ignore-<target> 注解来禁用:

/// ```ignore-x86_64
/// panic!("something")
/// ```
pub fn my_function() { }

i128 和 u128 在 extern "C" 函数中的使用

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 平台上)。

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

将 x86_64-apple-darwin 降级为 Tier 2

GitHub 将很快停止为公共仓库提供免费的 macOS x86_64 运行器。Apple 也宣布将停止对 x86_64 架构的支持。

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

预计 RFC 将在 Rust 1.89 和 1.90 发布之间接受,这意味着 Rust 1.89 将是最后一个将 x86_64-apple-darwin 视为 Tier 1 目标的版本。

对于用户来说,这个变化不会立即产生影响。在目标仍处于 Tier 2 时,Rust 项目将继续分发标准库和编译器的构建,供 rustup 或其他安装方法使用。随着时间推移,目标的测试覆盖率减少可能会导致某些功能不再兼容或出现问题,且没有进一步的公告。

wasm32-unknown-unknown 目标的标准 C ABI 支持

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

平台支持

  • x86_64-apple-darwin 正在被降级为带有主机工具的 Tier 2

  • 新增了 Tier-3 目标 loongarch32-unknown-none 和 loongarch32-unknown-none-softfloat

有关 Rust 的平台支持,请参阅 Rust 的平台支持页面。

稳定的 API

  • NonZero<char>

  • x86 的许多内在特性(未列出)

  • AVX512 内在特性

  • SHA512, SM3 和 SM4 内在特性

  • File::lock

  • File::lock_shared

  • File::try_lock

  • File::try_lock_shared

  • File::unlock

  • NonNull::from_ref

  • NonNull::from_mut

  • NonNull::without_provenance

  • `NonNull

::with_exposed_provenance`

  • NonNull::expose_provenance
  • OsString::leak
  • PathBuf::leak
  • Result::flatten
  • std::os::linux::net::TcpStreamExt::quickack
  • std::os::linux::net::TcpStreamExt::set_quickack

这些之前稳定的 API 现在也在常量上下文中变为稳定:

  • <[T; N]>::as_mut_slice
  • <[u8]>::eq_ignore_ascii_case
  • str::eq_ignore_ascii_case

其他更改

请查看 Rust、Cargo 和 Clippy 中的所有更改。


相關推薦

2023-07-15

Rust 1.71.0 稳定版已发布。 重要变化 C-unwindABI 正式稳定(同时包括其他-unwind后缀的 ABI 变体1):该特性对于跨 ABI 边界时,异常处理的行为更安全 调试器增加可视化属性#[debug_visualizer(natvis_file = "...")]和#[debug_visualizer(gdb_scrip

2023-04-22

 Rust 1.69.0 稳定版已发布。 1.69.0 稳定版中有什么 Cargo 建议自动修复警告 Rust 1.29.0 添加了 cargo fix 子命令来自动修复一些简单的编译器警告。从那时起,可以自动修复的警告数量继续稳步增加。此外,还增加了对自动修复一

2022-07-02

Rust 1.62.0 稳定版现已发布,具体更新内容如下: cargo add 现在可以使用cargo add直接从命令行添加新的依赖项。该命令支持指定功能和版本。它也可以用来修改现有的依赖项。 例如: cargo add log cargo add serde --features derive cargo add

2022-02-28

Rust 1.59.0 稳定版已正式发布,新版本最值得关注的特性是支持在代码中内联汇编 (Inline assembly),其他变化包括:引入解构式赋值、默认关闭增量编译,以及 Const 泛型参数支持设置默认值等。 内联汇编 (Inline assembly) 此项特

2024-10-09

Tauri 2.0 稳定版已正式发布。 Tauri 是一个桌面 UI 框架,可让开发者使用每个平台的 Webview 技术栈为所有主要桌面操作系统构建应用程序,目前支持 Windows/macOS/Linux 等平台。开发者通过 Tauri 几乎可以使用任何编译为 HTML、JS 和 CSS

2022-05-20

4 功能一起使用 X86 #[target_feature = "adx"] 现已到达稳定状态 Libraries ManuallyDrop<T>现在被记录为具有相同的布局T #[ignore = "…"] 运行测试时会打印信息 Consistently始终将 Windows 上缺少的 stdio 句柄显示为 NULL 句

2023-08-31

PF 到底是可观测领域的神器 or 鸡肋? sudo-rs 发布了首个稳定版:0.2.0。获取: sudo tar -C /usr/local -xvf sudo-0.2.0.tar.gz 下载地址:https://github.com/memorysafety/sudo-rs/releases/tag/v0.2.0 sudo-rs 是互联网安全研究小组 (ISRG) 发起的 Prossim

2023-02-10

历经三年多的开发,Meilisearch 1.0 首个完全稳定版已正式发布,可用于生产环境且向前兼容。 Meilisearch 是 Rust 实现的高性能开源搜索引擎,支持方便地集成到任何网站或应用程序,支持自托管 (self-hosting),可作为 Algolia 和 Elasti

2025-04-15

将弃用 i586-pc-windows-msvc 目标平台 一批 API 进入稳定 新特性 trait 向上转型:实现了 trait 对象的向上转型,若 trait 存在上级 trait,可将该 trait 对象的引用强制转换为上级 trait 对象的引用,如 Arc<dyn Trait&g

2022-11-04

Rust 1.65.0 稳定版已发布。此版本包含多项重要的语法变更,以及编辑器和标准库方面的改动。值得关注的是,Rust 1.65 现在还启用了 MIR 内联来优化编译,为 crate 提供了 3-10% 的编译时间改进。 语言特性 为枚举类型使用#[non_exh

2025-06-17

Oxlint 1.0 稳定版已正式发布。 Oxlint 是基于 Rust 的 JavaScript 和 TypeScript 静态代码分析工具,具有 500 多条 ESLint 规则且无需任何配置,性能比 ESLint 快 50~100 倍。 该项目是尤雨溪创业公司 VoidZero 开发的前端工具,VoidZero 于去年成

2024-08-18

并于 2025 年 1 月 3 日发布测试版 Rust v1.85,2 月 20 日发布稳定版 Rust v1.85。 使 Async Rust 体验更接近 sync Rust。计划提供几个异步构建块功能,其中最值得注意的是对 async closures 和Send bounds 的支持。这是将 async Rust

2025-04-15

搜索 (geosearch) 支持多租户 (multi-tenancy) Meilisearch 最新稳定版 1.4 已于今天发布,此版本引入了两个重要的实验性功能:向量存储和分数详情,并包含多项性能改进和错误修复。 新功能 (实验性) 向量存储 (Vector Store):

2023-06-03

于从 crates.io 读取索引。这个功能之前已经在 Rust 1.68.0 中稳定下来,但仍然需要配置才能在 crates.io 中使用。原计划就是在 1.70.0 中默认启用该功能的,现在如期实现。 当你从 crates.io 的索引中获取信息时,你应该看到性能的大