Rust 1.55.0 版本发布公告

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

Rust 团队很高兴地宣布 Rust 新版本 1.55.0 发布。Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。

如果您之前通过 rustup 安装了 Rust,则获取 Rust 1.55.0 版本非常简单,只需运行:

$ rustup update stable

如果您尚未安装 Rust,您可以从我们网站上的相应页面获取 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 值中;有些错误未分类,并放置在 catch-all 变体中。在之前的 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 代码应始终对任何它不知道的错误类型使用 catch-all _ 模式,在这种情况下,它可以匹配底层错误代码,或报告错误,或将其冒泡到调用代码。

我们正在进行此更改,以为将来引入新的 ErrorKind 变体铺平道路;这些新的变体将首先是 nightly-only,并且稍后才会变为稳定版。此更改确保匹配其不知道的变体的代码必须使用 catch-all _ 模式,这将同时适用于 ErrorKind::Uncategorized 和未来的 nightly-only 变体。

添加开放范围模式

Rust 1.55 稳定了在模式中使用开放范围

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

在此处阅读更多详细信息:here

稳定的 API

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

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

其他更改

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

1.55.0 版本贡献者

许多人齐心协力创建了 Rust 1.55.0 版本。没有你们所有人,我们不可能做到。感谢!

致谢

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