Rust 团队很高兴发布新版本 Rust 1.68.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果你之前通过 rustup 安装了 Rust,可以通过以下命令获取 1.68.0:
$ rustup update stable
如果你还没有安装 rustup,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看 1.68.0 的详细发布说明。
如果你想通过测试未来版本来帮助我们,可以考虑在本地更新以使用 beta 通道 (rustup default beta) 或 nightly 通道 (rustup default nightly)。请报告你遇到的任何 bug!
1.68.0 stable 版本有什么?
Cargo 的 sparse 协议
Cargo 的“sparse”注册表协议已稳定,用于读取 crate 索引,并且为发布在主 crates.io 注册表中的 crate 提供了位于 https://index.crates.io/ 的基础设施。之前的 git 协议(目前仍是默认协议)会克隆一个索引注册表中所有 crate 的仓库,但这已经开始遇到扩展性限制,更新该仓库时会有明显的延迟。新协议在访问 crates.io 时应该会显著提升性能,因为它只会下载你实际使用的部分 crate 的信息。
要在 crates.io 中使用 sparse 协议,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse,或编辑你的 .cargo/config.toml 文件添加
[]
= "sparse"
sparse 协议目前计划在几个月后的 1.70.0 版本中成为 crates.io 的默认协议。欲了解更多信息,请参阅之前在 Inside Rust 博客上的公告,以及 RFC 2789 和 Cargo Book 中当前的文档。
本地 Pin 构造
新的 pin! 宏从一个 T 表达式构造一个 Pin<&mut T>,该表达式被匿名地捕获到本地状态中。这通常被称为栈 pinning,但该“栈”也可以是 async fn 或 block 的捕获状态。这个宏类似于一些 crate 中的宏,例如 tokio::pin!,但标准库可以利用 Pin 的内部机制和临时生命周期扩展来实现一个更类似表达式的宏。
/// Runs a future to completion.
在这个例子中,原始的 future 将被移动到一个临时本地变量中,新的 pinned_future (类型为 Pin<&mut F>) 将引用它,并且该 pin 受正常的借用检查器约束,以确保它不会比该本地变量的生命周期更长。
默认的 alloc 错误处理程序
在 Rust 中分配失败时,像 Box::new 和 Vec::push 这样的 API 无法指示失败,因此需要采取某种发散的执行路径。当使用 std crate 时,程序会打印到 stderr 并中止。从 Rust 1.68.0 开始,包含 std 的二进制文件将继续保持这种行为。不包含 std、只包含 alloc 的二进制文件现在将在分配失败时 panic!,如果需要,可以通过 #[panic_handler] 进一步调整。
将来,包含 std 的行为很可能会改为与只包含 alloc 的二进制文件匹配。
稳定的 API
{core,std}::pin::pin!impl From<bool> for {f32,f64}std::path::MAIN_SEPARATOR_STRimpl DerefMut for PathBuf
这些 API 现在在 const 上下文下稳定了
其他变更
- 如先前宣布,Rust 中的 Android 平台支持现在面向 NDK r25,这对应于最低支持 API 级别 19 (KitKat)。
查看 Rust、Cargo 和 Clippy 中所有已更改的内容。
1.68.0 的贡献者
许多人齐心协力创建了 Rust 1.68.0。没有你们,我们不可能做到。 谢谢!