Rust 1.53.0 发布公告

2021年6月17日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 新版本 1.53.0 发布。Rust 是一种旨在赋能所有人的编程语言,助您构建可靠且高效的软件。

如果您之前通过 rustup 安装了 Rust,那么升级到 Rust 1.53.0 非常简单,只需运行:

$ rustup update stable

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

1.53.0 稳定版的新特性

此版本包含几个新的语言特性和许多新的库特性,包括期待已久的数组 IntoIterator 实现。请参阅详细发布说明,了解本文未涵盖的其他更改。

数组的 IntoIterator

这是 Rust 首个数组实现了 IntoIterator trait 的版本。这意味着您现在可以通过值来迭代数组:

for i in [1, 2, 3] {
    ..
}

以前,这只能通过引用来实现,使用 &[1, 2, 3][1, 2, 3].iter()

同样地,您现在可以将数组传递给期望 T: IntoIterator 的方法:

let set = BTreeSet::from_iter([1, 2, 3]);
for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) {
    ..
}

由于向后兼容性问题,这在以前没有实现。因为 IntoIterator 已经为数组的引用实现了,array.into_iter() 在早期版本中已经可以编译,解析为 (&array).into_iter()

从此版本开始,数组实现了 IntoIterator,并使用了一个小的变通方法来避免破坏现有代码。编译器将继续将 array.into_iter() 解析为 (&array).into_iter(),就好像 trait 实现不存在一样。这仅适用于 .into_iter() 方法调用语法,不影响任何其他语法,例如 for e in [1, 2, 3]iter.zip([1, 2, 3])IntoIterator::into_iter([1, 2, 3]),这些都可以正常编译。

由于 .into_iter() 的这个特殊情况仅是为了避免破坏现有代码而需要的,因此它将在今年晚些时候发布的新版本 Rust 2021 中移除。有关更多信息,请参阅版本公告

或模式

模式语法已扩展为支持在模式中任何位置嵌套 |。这使您可以编写 Some(1 | 2) 而不是 Some(1) | Some(2)

match result {
     Ok(Some(1 | 2)) => { .. }
     Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
     _ => { .. }
}

Unicode 标识符

标识符现在可以包含非 ASCII 字符。现在可以使用 Unicode 中定义的所有有效标识符字符,如 UAX #31 中所定义的那样。这包括来自许多不同脚本和语言的字符,但不包括 emoji。

例如:

const BLÅHAJ: &str = "🦈";

struct 人 {
    名字: String,
}

let α = 1;

编译器将警告可能涉及不同脚本的混淆情况。例如,使用看起来非常相似的标识符将导致警告。

warning: identifier pair considered confusable between `s` and `s`

Cargo 中 HEAD 分支名称支持

Cargo 不再假定 git 仓库的默认 HEAD 分支名为 master。这意味着对于默认分支名为 main 的仓库,您不再需要为 git 依赖项指定 branch = "main"

增量编译默认保持关闭

正如之前在 1.52.1 版本的博客文章中讨论的那样,增量编译已在 Rust 稳定发布通道中默认关闭。该功能在 beta 和 nightly 发布通道中仍然可用。对于 1.53.0 稳定版,重新启用增量编译的方法与 1.52.1 版本相同。

稳定的 API

以下方法和 trait 实现已稳定化。

其他更改

Rust 1.53.0 版本还有其他更改:请查看 RustCargoClippy 中的更改。

1.53.0 版本贡献者

许多人齐心协力创建了 Rust 1.53.0。没有你们大家,我们不可能做到。感谢!