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 test、cargo 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] 枚举,用于将错误分类为可移植的类别,例如 NotFound 或 WouldBlock。拥有 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
在此阅读更多详情。
稳定的 API
以下方法和 trait 实现已稳定。
Bound::clonedDrain::as_strIntoInnerError::into_errorIntoInnerError::into_partsMaybeUninit::assume_init_mutMaybeUninit::assume_init_refMaybeUninit::writearray::mapops::ControlFlowx86::_bittestx86::_bittestandcomplementx86::_bittestandresetx86::_bittestandsetx86_64::_bittest64x86_64::_bittestandcomplement64x86_64::_bittestandreset64x86_64::_bittestandset64
以下先前稳定的函数现在是 const。
其他更改
Rust 1.55.0 版本还有其他更改:请查看 Rust、Cargo 和 Clippy 中的变化。
1.55.0 的贡献者
许多人共同努力创建了 Rust 1.55.0。没有你们,我们不可能完成这项工作。谢谢!
纪念
Anna Harren 是社区成员,也是 Rust 的贡献者之一,她以创造术语“Turbofish”来描述 ::<> 语法而闻名。Anna 在与癌症抗争后最近不幸离世。她的贡献将永远被铭记并成为语言的一部分,我们将此版本献给她的纪念。