Rust 1.58.0稳定版中的新内容

114 阅读4分钟

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实际上是按照这个顺序搜索的:

  1. (Rust specific) 子代的PATH环境变量中列出的目录,如果它是由父代明确改变的。
  2. 应用程序加载的目录。
  3. 父进程的当前目录。
  4. 32位Windows系统的目录。
  5. 16位Windows系统目录。
  6. Windows目录。
  7. 列在PATH 环境变量中的目录。

然而,使用当前目录可能会导致令人惊讶的结果,甚至在处理不受信任的目录时导致恶意行为。例如,ripgrep ,当他们得知他们的子进程可以通过这种方式被拦截时,就发布了CVE-2021-3013。甚至微软自己的PowerShell文件也指出,他们不使用当前目录来保证安全。

Rust现在执行自己的搜索,不使用当前目录,传统的16位目录也不包括在内,因为没有API来发现它的位置。所以Windows上的Rust新的Command 搜索顺序是:

  1. 列在孩子的PATH 环境变量中的目录。
  2. 应用程序加载的目录。
  3. 32位Windows系统目录。
  4. Windows目录。
  5. 列在PATH 环境变量中的目录。

非Windows目标继续使用其平台特定的行为,最常见的是只考虑子代或父代PATH 环境变量。

标准库中的更多#[must_use]

#[must_use] 属性可以应用于类型或函数,当未能明确考虑它们或它们的输出时,几乎可以肯定是一个错误。这在标准库中早已被用于像Result 这样的类型,这些类型应该被检查出错误情况。这也有助于捕捉错误,比如期望一个函数在原地突变一个值,而实际上它却返回一个新的值。

建议35在2021年10月被批准,以审核和扩大整个标准库中#[must_use] 的应用,涵盖更多主要影响是返回值的函数。这类似于函数纯洁性的想法,但比真正的语言特性更松散。其中一些新增内容在1.57.0版本中出现,现在在1.58.0版本中,这项工作已经完成。

稳定的API

以下方法和特性的实现被稳定化:

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

其他变化

在Rust 1.58.0版本中还有其他变化:请查看RustCargoClippy的变化。

1.58.0的贡献者

许多人共同创造了Rust 1.58.0,没有你们,我们不可能做到这一点,谢谢你们!"。