Rust1.53.0稳定版中的新内容介绍

114 阅读3分钟

Rust团队很高兴地宣布Rust的新版本,1.53.0。Rust是一种编程语言,它使每个人都能建立可靠和高效的软件。

如果你已经通过rustup安装了以前的Rust版本,获得Rust 1.53.0就很容易了:

rustup update stable

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

1.53.0稳定版中的内容

这个版本包含了几个新的语言特性和许多新的库特性,包括期待已久的针对数组的IntoIterator 实现。参见详细的发布说明,了解本帖未涉及的其他变化。

用于数组的IntoIterator

这是第一个数组实现了IntoIterator 特质的Rust版本。这意味着你现在可以按值迭代数组了:

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() ,就像特质实现不存在一样。这只适用于.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字符。UAX #31中定义的Unicode中所有有效的标识符现在都可以使用。 这包括许多不同脚本和语言的字符,但不包括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发布通道上已经默认关闭。该功能在测试版和夜间发布通道上仍然可用。对于1.53.0稳定版,重新启用增量的方法与1.52.1相比没有变化。

稳定的API

以下方法和特性的实现被稳定化:

其他变化

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

1.53.0的贡献者

许多人共同创造了Rust 1.53.0,没有你们,我们不可能做到这一点。谢谢你们