Rust 团队很高兴地宣布 Rust 的新版本 1.70.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您之前通过 rustup 安装了 Rust,可以通过以下命令获取 1.70.0:
$ rustup update stable
如果您还没有安装,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看 1.70.0 的详细发布说明。
如果您想通过测试未来版本来帮助我们,可以考虑在本地更新到 beta 通道(rustup default beta)或 nightly 通道(rustup default nightly)。请报告您可能遇到的任何 bug!
1.70.0 稳定版中有哪些新特性
crates.io 默认启用 Sparse 协议
Cargo 的“sparse”协议现在默认用于从 crates.io 读取索引。此功能先前已在 Rust 1.68.0 中稳定,但仍需要配置才能与 crates.io 一起使用。宣布的计划是在 1.70.0 中将其设为默认,现在它来了!
您应该会看到从 crates.io 索引中获取信息时性能显著提升。处于严格防火墙后的用户需要确保可以访问 https://index.crates.io。如果出于某种原因您需要保留使用 GitHub 托管的 git 索引的旧默认设置,可以使用 registries.crates-io.protocol 配置项来更改默认设置。
需要注意的改变访问方式的一个副作用是,这也改变了 crate 缓存的路径,因此依赖项将重新下载。一旦您完全决定使用 sparse 协议,您可能希望清除旧的 $CARGO_HOME/registry/*/github.com-* 路径。
OnceCell 和 OnceLock
已稳定化两个用于共享数据一次性初始化的新类型:OnceCell 及其线程安全对应项 OnceLock。这些类型可以在不希望立即构建的任何地方使用,甚至在全局变量中的非 const 数据等场景下可能无法立即构建。
use OnceLock;
static WINNER: = new;
过去,lazy_static 和 once_cell 等 crate 满足了这一需求,但现在这些构建块已成为标准库的一部分,从 once_cell 的 unsync 和 sync 模块移植而来。将来可能还会稳定更多方法,以及存储初始化函数的配套类型 LazyCell 和 LazyLock,但这次稳定化的第一步应该已经覆盖了许多用例。
IsTerminal
这个新稳定的 trait 拥有一个方法 is_terminal,用于判断给定的文件描述符或句柄是否代表终端或 TTY。这是将外部 crate(如 atty 和 is-terminal)中存在的功能标准化的又一个例子,它在 Unix 目标上使用 C 库的 isatty 函数,在其他地方使用类似功能。一个常见的用例是程序区分是在脚本中运行还是在交互模式下运行,例如在交互时显示颜色甚至完整的 TUI。
use ;
调试信息的命名级别
-Cdebuginfo 编译器选项之前只支持 0..=2 的数字来增加调试信息量,其中 Cargo 在开发和测试配置文件中默认为 2,在发布和基准测试配置文件中默认为 0。现在这些调试级别可以通过名称设置:“none” (0)、“limited” (1) 和“full” (2),以及两个新级别:“line-directives-only”和“line-tables-only”。
Cargo 和 rustc 文档之前都将级别 1 称为“line tables only”,但它包含比这更多的信息,包括所有函数的信息,只是没有类型和变量的信息。该级别现在称为“limited”,新的“line-tables-only”级别进一步减少到仅包含文件名和行号,这是生成回溯所需的最少信息。这最终可能会成为 -Cdebuginfo=1 使用的级别。另一个 line-directives-only 级别旨在用于 NVPTX 性能分析,不建议用于其他用途。
请注意,这些命名选项尚不能通过 Cargo.toml 使用。对其的支持将在下一个版本 1.71 中提供。
test CLI 中强制执行的稳定性
编译 #[test] 函数时,可执行文件会从 test crate 获得一个命令行接口。这个 CLI 有许多选项,包括一些尚未稳定且需要指定 -Zunstable-options 的选项,就像 Rust 工具链中的许多其他命令一样。然而,尽管这原本只允许在 nightly 构建中使用,但此限制在 test 中一直没有生效——直到现在。从 1.70.0 开始,Rust 的稳定版和 beta 版将不再允许使用不稳定的 test 选项,使其真正如文档所述仅限 nightly 版本使用。
已知某些情况下可能在用户不知情的情况下使用了不稳定选项,特别是在 IntelliJ Rust 和其他 IDE 插件中使用的 --format json。这些项目已经在调整以适应此更改,JSON 输出的状态可以在其跟踪 issue 中查看。
稳定的 API
NonZero*::MIN/MAXBinaryHeap::retainstd::collections::binary_heap::IntoIter的Default实现std::collections::btree_map::{IntoIter, Iter, IterMut}的Default实现std::collections::btree_map::{IntoKeys, Keys}的Default实现std::collections::btree_map::{IntoValues, Values}的Default实现std::collections::btree_map::Range的Default实现std::collections::btree_set::{IntoIter, Iter}的Default实现std::collections::btree_set::Range的Default实现std::collections::linked_list::{IntoIter, Iter, IterMut}的Default实现std::vec::IntoIter的Default实现std::iter::Chain的Default实现std::iter::Cloned的Default实现std::iter::Copied的Default实现std::iter::Enumerate的Default实现std::iter::Flatten的Default实现std::iter::Fuse的Default实现std::iter::Rev的Default实现std::slice::Iter的Default实现std::slice::IterMut的Default实现Rc::into_innerArc::into_innerstd::cell::OnceCellOption::is_some_andNonNull::slice_from_raw_partsResult::is_ok_andResult::is_err_andstd::sync::atomic::Atomic*::as_ptrstd::io::IsTerminalstd::os::linux::net::SocketAddrExtstd::os::unix::net::UnixDatagram::bind_addrstd::os::unix::net::UnixDatagram::connect_addrstd::os::unix::net::UnixDatagram::send_to_addrstd::os::unix::net::UnixListener::bind_addrstd::path::Path::as_mut_os_strstd::sync::OnceLock
其他变化
1.70.0 的贡献者
许多人共同努力创造了 Rust 1.70.0。没有你们,我们不可能做到。谢谢!