Rust 1.70.0 发布公告

2023年6月1日 · Rust 发布团队

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

如果您之前通过 rustup 安装了 Rust,可以使用以下命令获取 1.70.0:

$ rustup update stable

如果您还没有安装 rustup,可以从我们网站的相应页面获取rustup,并在 GitHub 上查看 1.70.0 的详细发布说明

如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 通道 (rustup default beta) 或 nightly 通道 (rustup default nightly)。 请报告您可能遇到的任何错误!

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-* 路径。

OnceCellOnceLock

两个新类型已稳定,用于共享数据的一次性初始化,OnceCell 及其线程安全对应项 OnceLock。 这些类型可以用于任何不需要立即构造,甚至可能无法构造的情况,例如全局变量中的非 const 数据。

use std::sync::OnceLock;

static WINNER: OnceLock<&str> = OnceLock::new();

fn main() {
    let winner = std::thread::scope(|s| {
        s.spawn(|| WINNER.set("thread"));

        std::thread::yield_now(); // give them a chance...

        WINNER.get_or_init(|| "main")
    });

    println!("{winner} wins!");
}

诸如 lazy_staticonce_cell 之类的 crate 过去已经满足了这种需求,但现在这些构建块是标准库的一部分,从 once_cellunsyncsync 模块移植而来。 未来可能还会稳定更多的方法,以及存储其初始化函数的配套 LazyCellLazyLock 类型,但稳定化的第一步应该已经涵盖了许多用例。

IsTerminal

这个新稳定的 trait 有一个单独的方法 is_terminal,用于确定给定的文件描述符或句柄是否表示终端或 TTY。 这是标准化外部 crate 中已存在的功能的另一个案例,例如 attyis-terminal,在 Unix 目标上使用 C 库的 isatty 函数,在其他地方使用类似的功能。 一个常见的用例是程序区分是在脚本中运行还是在交互模式下运行,例如在交互时显示颜色甚至完整的 TUI。

use std::io::{stdout, IsTerminal};

fn main() {
    let use_color = stdout().is_terminal();
    // if so, add color codes to program output...
}

调试信息的命名级别

-Cdebuginfo 编译器选项之前仅支持数字 0..=2,用于增加调试信息的数量,其中 Cargo 在 dev 和 test 配置文件中默认为 2,在 release 和 bench 配置文件中默认为 0。 现在可以通过名称设置这些调试级别: “none” (0), “limited” (1), 和 “full” (2),以及两个新的级别,“line-directives-only” 和 “line-tables-only”。

Cargo 和 rustc 文档之前都将级别 1 称为 “仅行表”,但它不仅仅是包含所有函数的信息,只是不包含类型和变量。 该级别现在称为 “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 输出的状态。

稳定的 API

其他更改

查看 RustCargoClippy 中发生的所有更改。

1.70.0 的贡献者

许多人共同创建了 Rust 1.70.0。 没有大家,我们不可能做到这一点。 感谢!