Rust 1.55.0 发布公告

2021年9月9日 · Rust 发布团队

Rust 团队很高兴宣布 Rust 的新版本 1.55.0 发布。Rust 是一门赋能开发者构建可靠且高效软件的编程语言。

如果你之前通过 rustup 安装了 Rust,获取 Rust 1.55.0 就像运行以下命令一样简单:

$ rustup update stable

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

1.55.0 稳定版包含什么?

Cargo 对编译器错误进行去重

在以前的版本中,当运行 cargo testcargo check --all-targets 或类似命令时,如果同一个 Rust crate 在多种配置下构建,错误和警告可能会重复显示,因为 rustc 并行运行并且都显示相同的警告。

例如,在 1.54.0 中,常见的输出是这样的

$ cargo +1.54.0 check --all-targets
    Checking foo v0.1.0
warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted

warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: 1 warning emitted

    Finished dev [unoptimized + debuginfo] target(s) in 0.10s

在 1.55 中,此行为已调整为在编译结束时去重并打印一份报告

$ cargo +1.55.0 check --all-targets
    Checking foo v0.1.0
warning: function is never used: `foo`
 --> src/lib.rs:9:4
  |
9 | fn foo() {}
  |    ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: `foo` (lib) generated 1 warning
warning: `foo` (lib test) generated 1 warning (1 duplicate)
    Finished dev [unoptimized + debuginfo] target(s) in 0.84s

更快、更正确的浮点数解析

标准库中浮点数解析的实现已更新为使用 Eisel-Lemire 算法,这带来了速度上的改进和正确性的提高。过去,某些边缘情况未能解析,现在已得到修复。

你可以在拉取请求描述中阅读新实现的更多详情。

std::io::ErrorKind 变体更新

std::io::ErrorKind 是一个 #[non_exhaustive] 枚举,用于将错误分类为可移植的类别,例如 NotFoundWouldBlock。拥有 std::io::Error 的 Rust 代码可以调用 kind 方法来获取 std::io::ErrorKind 并对其进行匹配以处理特定错误。

并非所有错误都分类到 ErrorKind 值中;有些未分类并放入一个包罗万象的变体中。在 Rust 的早期版本中,未分类的错误使用 ErrorKind::Other;然而,用户创建的 std::io::Error 值也通常使用 ErrorKind::Other。在 1.55 中,未分类的错误现在使用内部变体 ErrorKind::Uncategorized,我们打算将其隐藏起来,永远不会让稳定的 Rust 代码明确命名;这使得 ErrorKind::Other 专门用于构造不来自标准库的 std::io::Error 值。这强制执行了 ErrorKind#[non_exhaustive] 特性。

Rust 代码绝不应该匹配 ErrorKind::Other 并期望任何特定的底层错误代码;只有当你捕获了一个使用了该错误类型的构造的 std::io::Error 时,才匹配 ErrorKind::Other。匹配 std::io::Error 的 Rust 代码应该始终对任何它不知道的错误类型使用 _,在这种情况下,它可以匹配底层错误代码,或者报告错误,或者将其向上层调用代码冒泡。

我们做出此更改是为了将来引入新的 ErrorKind 变体铺平道路;这些新变体将首先是 nightly only 的,稍后才会稳定。此更改确保匹配未知变体的代码必须使用包罗万象的 _ 模式,这对于 ErrorKind::Uncategorized 和将来的 nightly only 变体都有效。

添加了开区间模式

Rust 1.55 稳定了在模式中使用开区间

match x as u32 {
      0 => println!("zero!"),
      1.. => println!("positive number!"),
}

在此阅读更多详情。

稳定的 API

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

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

其他更改

Rust 1.55.0 版本还有其他更改:请查看 RustCargoClippy 中的变化。

1.55.0 的贡献者

许多人共同努力创建了 Rust 1.55.0。没有你们,我们不可能完成这项工作。谢谢!

纪念

Anna Harren 是社区成员,也是 Rust 的贡献者之一,她以创造术语“Turbofish”来描述 ::<> 语法而闻名。Anna 在与癌症抗争后最近不幸离世。她的贡献将永远被铭记并成为语言的一部分,我们将此版本献给她的纪念。