Rust 团队很高兴宣布推出 Rust 的新版本 1.72.0。Rust 是一门赋能每个人构建可靠且高效软件的编程语言。
如果您之前通过 rustup 安装了 Rust,可以通过以下命令获取 1.72.0:
$ rustup update stable
如果尚未安装,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看 1.72.0 的详细发布说明。
如果您想通过测试未来版本来帮助我们,可以考虑在本地更新到使用 beta 通道(rustup default beta)或 nightly 通道(rustup default nightly)。如果您遇到任何 bug,请报告!
1.72.0 稳定版有什么新内容
Rust 在错误报告中显示可能有用的被 cfg 禁用的项
您可以使用 cfg 有条件地启用 Rust 代码,例如仅在启用特定 crate 特性或仅在特定平台上提供某些函数。以前,以这种方式禁用的项对编译器来说是不可见的。但是现在,编译器会记住这些项的名称和 cfg 条件,以便在您尝试调用的函数由于需要启用 crate 特性而不可用时,能够报告出来。
Compiling my-project v0.1.0 (/tmp/my-project)
error[E0432]: unresolved import `rustix::io_uring`
--> src/main.rs:1:5
|
1 | use rustix::io_uring;
| ^^^^^^^^^^^^^^^^ no `io_uring` in the root
|
note: found an item that was configured out
--> /home/username/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustix-0.38.8/src/lib.rs:213:9
|
213 | pub mod io_uring;
| ^^^^^^^^
= note: the item is gated behind the `io_uring` feature
For more information about this error, try `rustc --explain E0432`.
error: could not compile `my-project` (bin "my-project") due to previous error
常量求值时间现在不受限制
为了防止用户提供的常量求值陷入编译时无限循环或占用无限长的编译时间,Rust 以前限制了任何给定常量求值中运行的*语句*的最大数量。然而,特别巧妙的 Rust 代码可能会触及这些限制并导致编译错误。更糟糕的是,代码是否触及限制可能因用户调用的库而异;如果您调用的库在其函数中将一个语句拆分成两个,您的代码随后就可能编译失败。
现在,您可以在编译时进行无限量的常量求值。为了避免长时间编译没有反馈,编译器在您的编译时代码运行一段时间后将始终发出消息,并在每次时间间隔翻倍后重复该消息。默认情况下,编译器在执行大量步骤后也会发出一个默认拒绝的 lint(const_eval_long_running),以捕获无限循环,但您可以使用 allow(const_eval_long_running) 来允许特别长的常量求值。
从 Clippy 提升(Uplifted)的 Lint
多个 Clippy 中的 lint 已被合并到 rustc 中:
-
clippy::undropped_manually_drops转为undropped_manually_drops(拒绝)ManuallyDrop不会 drop 其内部的值,因此对其调用std::mem::drop不会做任何事情。相反,此 lint 会建议先使用ManuallyDrop::into_inner,或者您可以使用不安全的ManuallyDrop::drop来原地运行析构函数。此 lint 默认被拒绝(deny)。
-
clippy::invalid_utf8_in_unchecked转为invalid_from_utf8_unchecked(拒绝) 和invalid_from_utf8(警告)- 第一个 lint 检查使用无效 UTF-8 字面量调用
std::str::from_utf8_unchecked和std::str::from_utf8_unchecked_mut的情况,这违反了它们的安全前置条件,导致未定义行为。此 lint 默认被拒绝(deny)。 - 第二个 lint 检查使用无效 UTF-8 字面量调用
std::str::from_utf8和std::str::from_utf8_mut的情况,这总是会返回错误。此 lint 默认是一个警告(warn)。
- 第一个 lint 检查使用无效 UTF-8 字面量调用
-
clippy::cmp_nan转为invalid_nan_comparisons(警告)- 此 lint 检查操作数之一与
f32::NAN或f64::NAN进行比较的情况。NaN 与任何值进行比较都没有意义——甚至包括它自己——因此这些比较总是为 false。此 lint 默认是一个警告(warn),并会建议改用is_nan()方法。
- 此 lint 检查操作数之一与
-
clippy::cast_ref_to_mut转为invalid_reference_casting(允许)- 此 lint 检查在不使用内部可变性(interior mutability)的情况下将
&T转换为&mut T的情况,这会导致立即的未定义行为,即使该引用未被使用。由于潜在的误报,此 lint 目前默认允许(allow),但计划在实现改进后于 1.73 版本中默认拒绝(deny)。
- 此 lint 检查在不使用内部可变性(interior mutability)的情况下将
稳定化的 API
这些 API 现在在 const 上下文中稳定。
其他变化
未来的 Windows 兼容性
在未来的一个版本中,我们计划将最低支持的 Windows 版本提高到 10。编译器 MCP 651 中接受的提案是,Rust 1.75 将是最后一个正式支持 Windows 7、8 和 8.1 的版本。当 Rust 1.76 于 2024 年 2 月发布时,只有 Windows 10 及更高版本将被支持为 tier-1 目标平台。此更改将同时适用于宿主编译器(host compiler)和编译目标(compilation target)。
更新:计划中的 Windows 最低支持级别提升已推迟到 Rust 1.78 版本,预计于 2024 年 5 月发布。
1.72.0 的贡献者
许多人共同努力创建了 Rust 1.72.0。没有你们所有人,这是不可能的。感谢!