Rust 团队很高兴地宣布 Rust 的新版本 1.58.0。Rust 是一种赋能每个人构建可靠且高效软件的编程语言。
如果你之前通过 rustup 安装过 Rust,获取 Rust 1.58.0 非常简单,只需执行以下命令:
$ rustup update stable
如果你还没有安装,可以从我们的网站上获取 rustup,并在 GitHub 上查看 1.58.0 的详细发布说明。
1.58.0 稳定版中的内容
Rust 1.58 带来了格式字符串中的捕获标识符,Windows 上 Command 搜索路径的改变,标准库中更多的 #[must_use] 注解,以及一些新的库 API 稳定化。
格式字符串中的捕获标识符
格式字符串现在可以通过在字符串中直接写 {ident} 来捕获参数。格式化长期以来一直支持位置参数(可选通过索引)和命名参数,例如:
println!; // implicit position
println!; // explicit index
println!; // named
现在也可以从周围作用域捕获命名参数,例如:
let person = get_person;
// ...
println!; // captures the local `person`
这也适用于格式化参数
let = get_format;
for in get_scores
格式字符串只能捕获简单的标识符,不能捕获任意路径或表达式。对于更复杂的参数,可以先将它们赋给局部名称,或者使用旧的 name = expression 风格的格式化参数。
此特性适用于所有接受格式字符串的宏。但是,在 2015 和 2018 edition 中,panic! 宏有一个特例,其中 panic!("{ident}") 仍然被视为未格式化的字符串——编译器会对此发出警告,提示这不会产生预期效果。由于 2021 edition 更新了 panic 宏以提高一致性,这在 2021 edition 的 panic! 中按预期工作。
缩减 Windows Command 搜索路径
在 Windows 目标上,std::process::Command 将不再在当前目录中搜索可执行文件。这种行为源于 win32 CreateProcess API 的历史行为,因此 Rust 实际上是按以下顺序搜索的:
- (Rust 特有)子进程的 PATH 环境变量中列出的目录,如果它与父进程的 PATH 显式不同。
- 加载应用程序的目录。
- 父进程的当前目录。
- 32 位 Windows 系统目录。
- 16 位 Windows 系统目录。
- Windows 目录。
- PATH 环境变量中列出的目录。
然而,使用当前目录可能导致意想不到的结果,甚至在处理不受信任的目录时导致恶意行为。例如,ripgrep 在得知其子进程可以通过这种方式被拦截后发布了 CVE-2021-3013。即使是微软自己的 PowerShell 文档也表明出于安全考虑,他们不使用当前目录。
Rust 现在执行自己的搜索,不包括当前目录,并且也不包括遗留的 16 位目录,因为没有 API 可以发现其位置。因此,Rust 在 Windows 上的新的 Command 搜索顺序是:
- 子进程的 PATH 环境变量中列出的目录。
- 加载应用程序的目录。
- 32 位 Windows 系统目录。
- Windows 目录。
- PATH 环境变量中列出的目录。
非 Windows 目标继续使用其平台特定的行为,通常只考虑子进程或父进程的 PATH 环境变量。
标准库中更多的 #[must_use]
当未能明确考虑类型或函数,或者忽略其输出时几乎肯定会产生 bug 时,可以对类型或函数应用 #[must_use] 属性。这在标准库中长期用于像 Result 这样的类型,它们应该被检查是否存在错误条件。这也有助于捕获诸如期望函数原地修改某个值,但它实际上返回一个新值之类的错误。
库提案 35 于 2021 年 10 月获得批准,旨在审查和扩展 #[must_use] 在整个标准库中的应用,涵盖更多主要作用是返回值的函数。这类似于函数纯粹性的概念,但比真正的语言特性要宽松。其中一些新增功能已包含在 1.57.0 版本中,现在在 1.58.0 版本中,这项工作已经完成。
稳定化的 API
以下方法和 trait 实现已稳定化。
Metadata::is_symlinkPath::is_symlink{integer}::saturating_divOption::unwrap_uncheckedResult::unwrap_uncheckedResult::unwrap_err_uncheckedFile::options
以下先前稳定的函数现在是 const 函数。
Duration::newDuration::checked_addDuration::saturating_addDuration::checked_subDuration::saturating_subDuration::checked_mulDuration::saturating_mulDuration::checked_div
其他变更
Rust 1.58.0 版本还有其他变更:请查看 Rust、Cargo 和 Clippy 的变更内容。
1.58.0 贡献者
许多人共同努力促成了 Rust 1.58.0 的发布。没有大家的贡献,这是不可能完成的。 感谢!