Rust 1.57.0 版本发布

2021年12月2日 · Rust 发布团队

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

如果你之前通过 rustup 安装了 Rust,那么获取 Rust 1.57.0 版本非常简单,只需运行:

$ rustup update stable

如果你还没有安装,你可以从我们的网站上的相应页面获取 rustup,并查看 GitHub 上1.57.0 版本的详细发布说明

1.57.0 稳定版的新特性

Rust 1.57 版本将 panic! 引入 const 上下文,为 Cargo 添加了对自定义 profile 的支持,并稳定了可能失败的预留 API。

panic! in const 上下文中的 panic!

在之前的 Rust 版本中,panic! 宏不能在 const fn 和其他编译时上下文中使用。现在,这已经被稳定化。随着 panic! 的稳定,其他几个标准库 API 现在也可以在 const 中使用,例如 assert!

此稳定化尚未包含完整的格式化基础设施,因此 panic! 宏必须使用静态字符串 (panic!("...")) 或单个 &str 插值 (panic!("{}", a)) 调用,后者必须与 {} 一起使用(没有格式说明符或其他 traits)。

预计未来此支持将扩展,但这种最小化的稳定化已经实现了直接的编译时断言,例如验证类型的大小。

const _: () = assert!(std::mem::size_of::<u64>() == 8);
const _: () = assert!(std::mem::size_of::<u8>() == 1);

Cargo 对自定义 profile 的支持

Cargo 长期以来支持四种 profile:devreleasetestbench。在 Rust 1.57 中,添加了对任意命名 profile 的支持。

例如,如果你只想在进行最终生产构建时启用链接时优化 (LTO),将以下代码片段添加到 Cargo.toml 将在选择此 profile 时启用 lto 标志,但避免在常规 release 构建中启用它。

[profile.production]
inherits = "release"
lto = true

请注意,自定义 profile 必须指定一个从中继承默认设置的 profile。一旦定义了 profile,构建代码的 Cargo 命令可以使用 --profile production 来要求使用它。目前,这将在一个单独的目录(在本例中为 target/production)中构建 artifacts,这意味着 artifacts 不在目录之间共享。

可能失败的内存分配

Rust 1.57 稳定化了 VecStringHashMapHashSetVecDequetry_reserve。此 API 使调用者能够为这些类型可能失败地分配后备存储。

如果全局分配器失败,Rust 通常会中止进程,但这并不总是理想的。此 API 提供了一种在处理标准库集合时避免中止的方法。但是,Rust 不保证返回的内存实际上是由内核分配的:例如,如果在 Linux 上启用了过度提交,则在尝试使用内存时,内存可能不可用。

稳定的 API

以下方法和 trait 实现已稳定化。

以下之前稳定的函数现在是 const

其他更改

Rust 1.57.0 版本还有其他更改:查看 RustCargoClippy 中更改的内容。

1.57.0 版本的贡献者

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