Rust 1.77.0 版本发布

2024 年 3 月 21 日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 新版本 1.77.0 发布。Rust 是一种编程语言,旨在赋能每个人构建可靠且高效的软件。

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

$ rustup update stable

如果您尚未安装,您可以从我们网站上的相应页面获取 rustup,并查看1.77.0 版本的详细发布说明

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

1.77.0 稳定版的新特性

此版本相对较小,但与往常一样,即使是渐进式的改进也能带来更大的整体提升。本文重点介绍其中一些更改,其他更改可能满足更小众的需求。

C 字符串字面量

Rust 现在支持 C 字符串字面量 (c"abc"),它会扩展为内存中类型为 &'static CStr 的以空字节结尾的字符串。这使得编写与需要以空字符结尾的字符串的外部语言接口互操作的代码更加容易,所有相关的错误检查(例如,缺少内部空字节)都在编译时执行。

支持 async fn 中的递归

由于编译器限制,异步函数以前无法调用自身。在 1.77 版本中,该限制已被解除,因此允许递归调用,只要它们使用某种形式的间接来避免函数状态的无限大小。

这意味着像这样的代码现在可以工作了

async fn fib(n: u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
   }
}

offset_of!

1.77.0 版本稳定了用于结构体字段的 offset_of!,它提供了对结构体相关公共字段的字节偏移量的访问。当需要在没有类型实例的情况下获取字段的偏移量时,此宏最有用。在 stable 版本上已经可以实现这样的宏,但是在没有类型实例的情况下,实现将需要棘手的不安全代码,这很容易意外引入未定义的行为。

用户现在可以使用 offset_of!(StructName, field) 访问公共字段的偏移量。这将扩展为一个 usize 表达式,表示从结构体开始的字节偏移量。

默认在 release profile 中启用 strip

Cargo profile 中未启用输出中的 debuginfo(例如,debug = 0)将默认启用 strip = "debuginfo"

这主要是因为(预编译的)标准库附带了 debuginfo,这意味着即使本地编译没有明确请求 debuginfo,静态链接的结果也会包含来自标准库的 debuginfo。

想要 debuginfo 的用户可以使用相关 Cargo profile 中的 debug 标志显式启用它。

稳定的 API

其他更改

查看 RustCargoClippy 中发生的所有更改。

1.77.0 版本的贡献者

许多人齐心协力创造了 Rust 1.77.0。没有你们所有人,我们不可能做到。感谢!