Rust1.56.0稳定版中的新功能介绍

346 阅读4分钟

Rust团队很高兴地宣布新版本的Rust,1.56.0。这也稳定了2021年的版本。 Rust是一种编程语言,使每个人都能建立可靠和高效的软件。

如果你已经通过rustup安装了以前的Rust版本,获得Rust 1.56.0就很简单了:

rustup update stable

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

1.56.0稳定版中的内容

Rust 2021

我们在5月份写了关于Rust 2021版本的计划。 版本是一种机制,用于选择修改,否则可能造成向后兼容的风险。关于如何实现的细节,请参见版本指南。 这是一个较小的版本,特别是与2018年相比,但仍有一些不错的生活质量变化,需要版本选择,以避免破坏现有代码中的一些角落情况。请看下面的版本指南的新章节,以了解每个新功能的更多细节和迁移的指导:

闭包中的不连续捕获

闭包会自动捕获在正文中使用的值或对标识符的引用,但在2021年之前,它们总是被作为一个整体捕获。新的分离捕获功能可能会简化你编写闭包的方式,所以让我们看一个快速的例子:

// 2015 or 2018 edition code
let a = SomeStruct::new();

// Move out of one field of the struct
drop(a.x);

// Ok: Still use another field of the struct
println!("{}", a.y);

// Error: Before 2021 edition, tries to capture all of `a`
let c = || println!("{}", a.y);
c();

为了解决这个问题,你不得不在闭包前手动提取类似let y = &a.y;的东西来限制其捕获。从Rust 2021开始,闭包将只自动捕获它们所使用的字段,所以上面的例子可以顺利编译

这个新行为只在新版本中激活,因为它可以改变字段被丢弃的顺序。对于所有版本的变化,我们可以进行自动迁移,它将通过在闭包内插入let _ = &a; 来更新你的闭包,以强制整个结构像以前一样被捕获。

迁移到2021年

该指南包括所有新功能的迁移说明,以及将现有项目过渡到新版本的一般说明。在许多情况下,cargo fix 可以自动进行必要的更改。你甚至可能发现,对于2021年,你的代码根本不需要改变

无论这个版本表面上看起来有多小,它仍然是许多贡献者辛勤工作的产物:请看我们专门的庆祝和感谢跟踪器

货物rust-version

Cargo.toml 现在支持一个[package] rust-version字段,以指定一个板块所支持的最小Rust版本,如果该版本不被满足,Cargo会提前退出,出现错误。目前这并不影响依赖关系解析器,但我们的想法是在兼容性问题变成隐秘的编译器错误之前将其捕获。

中的新绑定binding @ pattern

Rust模式匹配可以用一个绑定整个值的单一标识符来编写,然后是@ 和一个更精细的结构模式,但这并不允许在该模式中进行额外的绑定--直到现在!这在以前是允许的:

struct Matrix {
    data: Vec<f64>,
    row_len: usize,
}

// Before, we need separate statements to bind
// the whole struct and also read its parts.
let matrix = get_matrix();
let row_len = matrix.row_len;
// or with a destructuring pattern:
let Matrix { row_len, .. } = matrix;

// Rust 1.56 now lets you bind both at once!
let matrix @ Matrix { row_len, .. } = get_matrix();

实际上,在Rust 1.0之前的日子里,这是被允许的,但由于当时已知的不健全性,这被删除了。随着借贷检查器的发展,以及大量的测试,编译器团队认为这在稳定的Rust中是安全的。

稳定的API

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

以下是之前稳定的函数,现在是const

其他变化

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

1.56.0的贡献者

许多人共同创建了Rust 1.56.0和2021版。 没有你们,我们不可能做到这一点。谢谢