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]
注解,以及一些新的库稳定化。
格式化字符串中捕获的标识符
现在,格式化字符串只需在字符串中写入 {ident}
即可捕获参数。格式化字符串长期以来接受位置参数(可选索引)和命名参数,例如:
println!("Hello, {}!", get_person()); // implicit position
println!("Hello, {0}!", get_person()); // explicit index
println!("Hello, {person}!", person = get_person()); // named
现在,命名参数也可以从周围的作用域捕获,例如:
let person = get_person();
// ...
println!("Hello, {person}!"); // captures the local `person`
这也可以用于格式化参数:
let (width, precision) = get_format();
for (name, score) in get_scores() {
println!("{name}: {score:width$.precision$}");
}
格式化字符串只能捕获简单的标识符,不能捕获任意路径或表达式。对于更复杂的参数,可以先将其分配给局部变量,或者使用较旧的 name = expression
格式化参数样式。
此功能适用于所有接受格式化字符串的宏。但是,一个特殊情况是 2015 和 2018 版本的 panic!
宏,其中 panic!("{ident}")
仍然被视为未格式化的字符串 —— 编译器将警告这没有达到预期的效果。由于 2021 版本更新了 panic 宏以提高一致性,因此这在 2021 版本的 panic!
中按预期工作。
Command
搜索路径
减少 Windows 在 Windows 目标上,std::process::Command
将不再在当前目录中搜索可执行文件。这种效果是由于 win32 CreateProcess
API 的历史行为导致的,因此 Rust 实际上按以下顺序搜索:
- (Rust 特有的)如果子进程的
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]
标准库中更多 当未能明确考虑它们或它们的输出几乎肯定是一个错误时,可以将 #[must_use]
属性应用于类型或函数。长期以来,标准库一直在使用它来表示诸如 Result
之类的类型,应该检查错误情况。这也有助于发现错误,例如期望一个函数就地修改一个值,而实际上它返回一个新值。
库 提案 35 于 2021 年 10 月获得批准,旨在审核和扩展整个标准库中 #[must_use]
的应用,涵盖更多主要影响是返回值的函数。这类似于函数纯度的概念,但比真正的语言特性更宽松。其中一些添加在 1.57.0 版本中出现,现在在 1.58.0 中,该工作已完成。
稳定的 API
以下方法和 trait 实现已稳定化。
Metadata::is_symlink
Path::is_symlink
{integer}::saturating_div
Option::unwrap_unchecked
Result::unwrap_unchecked
Result::unwrap_err_unchecked
File::options
以下先前稳定的函数现在是 const
。
Duration::new
Duration::checked_add
Duration::saturating_add
Duration::checked_sub
Duration::saturating_sub
Duration::checked_mul
Duration::saturating_mul
Duration::checked_div
其他更改
Rust 1.58.0 版本中还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改。
1.58.0 的贡献者
很多人齐心协力创建了 Rust 1.58.0。没有大家,我们不可能做到这一点。谢谢!