您的位置:首页 > IT > 正文

Rust 1.68.0 现已发布|世界观察

来源:OSCHINA     时间:2023-03-11 07:18:20

1.68.0 稳定版中有什么:

Cargo 的稀疏协议

Cargo 的“稀疏”注册协议已经稳定,可以读取 crates 的索引,以及用于在 crates.io 注册中心发布的的基础设施。

之前的 git 协议(现在仍然是默认协议)是克隆一个存储库,该存储库会索引注册表中所有可用的 crates ,但这已经开始达到扩展的最大限制,以至于在更新该存储库时会出现明显的延迟。


(相关资料图)

新协议应该可以在访问 crate 时提供明显的性能改进。

要在 crates.io 中使用稀疏协议,请设置环境变量 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse

或编辑 .cargo/config.toml文件,添加:

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

目前 Rust 团队 计划在几个月后,让 Cargo 的稀疏协议成为 Rust 1.70.0 版本中 crates.io 的默认协议。

有关更多信息,请参阅 Inside Rust 博客上的公告 ,以及RFC 2789和 Cargo Book 中的文档。

本地 Pin建设

新的 pin!宏从 T表达式构造 Pin<&mut T>,在本地状态中匿名捕获。通常称为堆栈固定,但“堆栈”也可以是 async fn或块的捕获状态。

这个宏类似于一些 crate,比如 tokio::pin!,但是标准库可以利用 Pin内部结构和临时生命周期扩展来获得更像表达式的宏。

fn block_on(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 无法指示该失败,因此需要采取一些不同的执行路径。当使用 stdcrate 时,程序将打印到 stderr并中止。

从 Rust 1.68.0 开始,包含 std的二进制文件将继续具有此行为。不包含 std仅包含 alloc的二进制文件现在将在分配失败时 panic!。如果需要,可以通过 #[panic_handler]进一步调整。

将来, std的行为也可能会更改,以匹配 alloc-only 的二进制文件行为。

稳定的 API

{core,std}::pin::pin!impl From for {f32,f64}std::path::MAIN_SEPARATOR_STRimpl DerefMut for PathBuf

Other changes 其他改动

Rust 中的 Android 平台支持现在以 NDK r25 为目标,这对应于支持的最低 API 级别 19 (KitKat)。

查看 Rust 、 Cargo和Clippy中发生的所有变化。

更新公告:https://blog.rust-lang.org/2023/03/09/Rust-1.68.0.html

相关文章