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年版对恐慌性宏进行了更新,以提高一致性,这在2021年的panic! 中如期工作。
减少的WindowsCommand 搜索路径
在Windows目标上,std::process::Command 将不再搜索当前目录下的可执行文件。这种效果是由于win32的历史行为所造成的。 CreateProcessAPI的历史行为,所以Rust实际上是按照这个顺序搜索的:
- (Rust specific) 子代的
PATH环境变量中列出的目录,如果它是由父代明确改变的。 - 应用程序加载的目录。
- 父进程的当前目录。
- 32位Windows系统的目录。
- 16位Windows系统目录。
- Windows目录。
- 列在
PATH环境变量中的目录。
然而,使用当前目录可能会导致令人惊讶的结果,甚至在处理不受信任的目录时导致恶意行为。例如,ripgrep ,当他们得知他们的子进程可以通过这种方式被拦截时,就发布了CVE-2021-3013。甚至微软自己的PowerShell文件也指出,他们不使用当前目录来保证安全。
Rust现在执行自己的搜索,不使用当前目录,传统的16位目录也不包括在内,因为没有API来发现它的位置。所以Windows上的Rust新的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
以下方法和特性的实现被稳定化:
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,没有你们,我们不可能做到这一点,谢谢你们!"。