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 的 sparse 协议
Cargo 的 “sparse” 注册表协议已稳定,用于读取 crate 的索引,并为在主要 crates.io 注册表中发布的 crate 提供了 https://index.crates.io/
的基础设施。之前的 git 协议(仍然是默认协议)克隆一个仓库,该仓库索引注册表中所有可用的 crate,但这已开始遇到扩展性限制,更新该仓库时会出现明显的延迟。新的协议应该在访问 crates.io 时提供显著的性能提升,因为它只会下载您实际使用的 crate 子集的信息。
要将 sparse 协议与 crates.io 一起使用,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
,或者编辑您的 .cargo/config.toml
文件 以添加
[registries.crates-io]
protocol = "sparse"
sparse 协议目前计划在几个月后的 1.70.0 版本中成为 crates.io 的默认协议。有关更多信息,请参阅 Inside Rust 博客上的先前公告,以及 RFC 2789 和 Cargo Book 中当前的文档。
Pin
构建
本地 新的 pin!
宏从 T
表达式构造 Pin<&mut T>
,匿名捕获在本地状态中。这通常称为栈钉住 (stack-pinning),但 “栈” 也可以是 async fn
或代码块的捕获状态。这个宏类似于一些 crate,例如 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>
,并且该 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_STR
impl DerefMut for PathBuf
这些 API 现在在 const 上下文中是稳定的
其他更改
- 正如先前宣布的那样,Rust 中的 Android 平台支持现在以 NDK r25 为目标,这对应于最低支持 API 级别 19 (KitKat)。
查看 Rust、Cargo 和 Clippy 中发生的所有更改。
1.68.0 版本的贡献者
许多人齐心协力创建了 Rust 1.68.0。没有大家,我们不可能做到。谢谢!