Rust 1.68.0 发布公告

2023 年 3 月 9 日 · Rust 发布团队

Rust 团队很高兴宣布 Rust 的新版本 1.68.0。Rust 是一种编程语言,它赋予每个人构建可靠高效软件的能力。

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

$ rustup update stable

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

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

1.68.0 稳定版中的新内容

Cargo 的稀疏协议

Cargo 的“稀疏”注册表协议已稳定用于读取箱子的索引,以及 https://index.crates.io/ 上用于在主要 crates.io 注册表中发布的箱子的基础设施。之前的 git 协议(仍然是默认协议)会克隆一个存储库,该存储库索引了注册表中可用的所有箱子,但这开始遇到扩展限制,在更新该存储库时会产生明显的延迟。新的协议在访问 crates.io 时应该会提供显著的性能提升,因为它只会下载您实际使用的箱子的信息子集。

要将稀疏协议与 crates.io 一起使用,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse,或编辑您的 .cargo/config.toml 文件 以添加

[registries.crates-io]
protocol = "sparse"

稀疏协议目前计划在几个月后的 1.70.0 版本中成为 crates.io 的默认协议。有关更多信息,请参阅 Inside Rust 博客上的先前 公告,以及 RFC 2789 和 Cargo 手册中的当前 文档

本地 Pin 构造

新的 pin! 宏从 T 表达式构造 Pin<&mut T>,匿名捕获在本地状态中。这通常称为堆栈固定,但该“堆栈”也可以是 async fn 或块的捕获状态。此宏类似于一些箱子,例如 tokio::pin!,但标准库可以利用 Pin 内部机制和 临时生命周期扩展 来实现更类似表达式的宏。

/// Runs a future to completion.
fn block_on<F: Future>(future: F) -> F::Output {
    let waker_that_unparks_thread = todo!();
    let mut cx = Context::from_waker(&waker_that_unparks_thread);
    // Pin the future so it can be polled.
    let mut pinned_future = pin!(future);
    loop {
        match pinned_future.as_mut().poll(&mut cx) {
            Poll::Pending => thread::park(),
            Poll::Ready(result) => return result,
        }
    }
}

在此示例中,原始 future 将被移动到一个临时的本地变量中,由新的 pinned_future 引用,类型为 Pin<&mut F>,并且该固定值受正常的借用检查器约束,以确保它不会超出该本地的生命周期。

默认 alloc 错误处理程序

当 Rust 中的分配失败时,Box::newVec::push 等 API 无法指示失败,因此需要采用一些发散的执行路径。当使用 std 箱子时,程序将打印到 stderr 并中止。从 Rust 1.68.0 开始,包含 std 的二进制文件将继续保持此行为。不包含 std,只包含 alloc 的二进制文件现在将在分配失败时 panic!,如果需要,可以通过 #[panic_handler] 进一步调整。

将来,std 的行为很可能也会更改为与仅 alloc 的二进制文件一致。

稳定的 API

这些 API 现在在 const 上下文中是稳定的

其他更改

  • 之前宣布,Rust 中的 Android 平台支持现在针对 NDK r25,对应于最低支持的 API 级别 19(KitKat)。

查看 RustCargoClippy 中的所有更改。

1.68.0 的贡献者

许多人共同创建了 Rust 1.68.0。没有你们,我们无法做到。 感谢!