宣布 Rust 1.33.0

2019 年 2 月 28 日 · Rust 发布团队

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

如果您之前已通过 rustup 安装了 Rust,获取 Rust 1.33.0 就像

$ rustup update stable

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

1.33.0 稳定版的新功能

此版本中最大的两个功能是对 const fn 的重大改进,以及对一个新概念的稳定化:“固定”。

const fn 改进

使用 const fn,您现在可以做更多的事情! 具体来说

  • 不可反驳的解构模式(例如 const fn foo((x, y): (u8, u8)) { ... }
  • let 绑定(例如 let x = 1;
  • 可变 let 绑定(例如 let mut x = 1;
  • 赋值(例如 x = y)和赋值运算符(例如 x += y)表达式,即使赋值目标是投影(例如结构体字段或索引操作,如 x[3] = 42
  • 表达式语句(例如 3;

您还可以const fn 中调用 const unsafe fn,如下所示

const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
    unsafe { foo() }
}

通过这些新增功能,标准库中的许多函数都可以标记为 const。我们将在下面的库部分列出这些函数。

固定

此版本为 Rust 程序引入了新的概念,它以两种类型实现:std::pin::Pin<P> 类型Unpin 标记特征。核心思想在std::pin 的文档中进行了阐述

有时,拥有保证不会移动的对象是有用的,这意味着它们在内存中的位置不会改变,因此可以依赖它们。这种场景的一个主要例子是构建自引用结构体,因为移动带有指向自身的指针的对象将使它们失效,这会导致未定义的行为。

Pin<P> 确保任何指针类型 P 的指向对象在内存中具有稳定的位置,这意味着它不能移动到其他位置,并且它的内存不能在它被丢弃之前被释放。我们说指向对象是“固定的”。

此功能主要由库作者使用,因此我们在这里不会过多地讨论细节。如果您有兴趣深入了解细节,请查阅文档。但是,此 API 的稳定化对于 Rust 用户来说非常重要,因为它是在实现备受期待的 Rust 功能 async/await 方面迈出的重要一步。我们还没有完全实现,但这种稳定化使我们更接近目标。您可以在areweasyncyet.rs 上跟踪所有必要的特性。

导入为 _

您现在可以将项目导入为 _。这允许您导入特征的实现,而不会在命名空间中出现名称。例如

use std::io::Read as _;

// Allowed as there is only one `Read` in the module.
pub trait Read {}

有关更多详细信息,请参阅详细的发布说明

库稳定化

以下是所有已设置为 const 的内容

此外,这些 API 已稳定

有关更多详细信息,请参阅详细的发布说明

Cargo 功能

如果在初始构建期间修改了文件,Cargo 现在应该重新构建板条箱。

有关更多信息,请参阅详细的发布说明

Crates.io

如前所述,与此版本同时,Crates.io 将要求您拥有经过验证的电子邮件地址才能发布。从 2019 年 3 月 1 日 00:00 UTC 开始,如果您没有经过验证的电子邮件地址并运行 cargo publish,您将收到错误消息。

这确保我们可以遵守 DMCA 程序。如果您在上次发布周期中没有理会 Cargo 打印的警告,请前往crates.io/me 设置并验证您的电子邮件地址。此电子邮件地址永远不会公开显示,仅用于 Crates.io 操作。

1.33.0 的贡献者

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