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年相比,但仍有一些不错的生活质量变化,需要版本选择,以避免破坏现有代码中的一些角落情况。请看下面的版本指南的新章节,以了解每个新功能的更多细节和迁移的指导:
- 离散捕获:闭包现在捕获单个命名的字段,而不是总是捕获整个标识符。
IntoIterator对于数组: 现在按值而不是按引用来迭代项目。array.into_iter()- 宏规则中的 Or 模式现在与
:pat中的顶级A|B匹配。 - 默认的Cargo特性解析器现在是第2版。
- 增加了前奏的内容。
TryInto,TryFrom, 和FromIterator现在是默认的范围。 - 恐慌宏现在总是期待格式化字符串,就像
println!()一样。 - 为
ident#,ident"...", 和ident'...'保留了语法。 - 警告升级为错误:
bare_trait_objects和ellipsis_inclusive_range_patterns。
闭包中的不连续捕获
闭包会自动捕获在正文中使用的值或对标识符的引用,但在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
以下方法和特性的实现被稳定化:
std::os::unix::fs::chrootUnsafeCell::raw_getBufWriter::into_partscore::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
(以前只在std)Vec::shrink_toString::shrink_toOsString::shrink_toPathBuf::shrink_toBinaryHeap::shrink_toVecDeque::shrink_toHashMap::shrink_toHashSet::shrink_to
以下是之前稳定的函数,现在是const:
其他变化
在Rust 1.56.0版本中还有其他变化:请查看Rust、Cargo和Clippy的变化。
1.56.0的贡献者
许多人共同创建了Rust 1.56.0和2021版。 没有你们,我们不可能做到这一点。谢谢