发布 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 stable 版本有什么新功能

此版本相对较小,但正如往常一样,即使是增量改进也能带来整体的更大进步。本文重点介绍了一些更改,其他更改可能会满足更小众的需求。

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 版本上实现这样的宏已经可能,但如果没有类型的实例,实现将需要棘手的 unsafe 代码,这很容易意外地引入未定义行为。

用户现在可以使用 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。没有大家的贡献,我们不可能完成。 感谢!