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 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
值中;有些错误未分类,并放置在 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 实现已稳定。
Bound::cloned
Drain::as_str
IntoInnerError::into_error
IntoInnerError::into_parts
MaybeUninit::assume_init_mut
MaybeUninit::assume_init_ref
MaybeUninit::write
array::map
ops::ControlFlow
x86::_bittest
x86::_bittestandcomplement
x86::_bittestandreset
x86::_bittestandset
x86_64::_bittest64
x86_64::_bittestandcomplement64
x86_64::_bittestandreset64
x86_64::_bittestandset64
以下先前稳定的函数现在是 const
。
其他更改
Rust 1.55.0 版本中还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改。
1.55.0 版本贡献者
许多人齐心协力创建了 Rust 1.55.0 版本。没有你们所有人,我们不可能做到。感谢!
致谢
Anna Harren 是社区成员和 Rust 贡献者,以创造术语 “Turbofish” 来描述 ::<>
语法而闻名。Anna 最近在与癌症抗争后去世。她的贡献将永远被铭记,并将成为语言的一部分,我们在此版本中纪念她。