Rust 团队很高兴宣布 Rust 的新版本 1.56.0 发布。此版本也稳定了 2021 版。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.56.0 非常简单,只需执行
$ rustup update stable
如果您尚未安装它,可以从我们网站上的相应页面获取 rustup,并在 GitHub 上查看 1.56.0 的详细发行说明。
1.56.0 stable 有什么新内容
Rust 2021 版
我们在五月份写了一篇关于 Rust 2021 版计划的文章。版本(Edition)是一种可选的更改机制,用于引入可能带来向后兼容性风险的更改。详情请参阅版本指南,了解如何实现这一目标。与 2018 版相比,这是一个较小的版本,但仍然有一些很好的改进,这些改进需要通过版本选择启用,以避免破坏现有代码中的某些边缘情况。请参阅下面的版本指南新章节,了解每个新功能的更多详情和迁移指导。
- 不连续捕获(Disjoint capture):闭包现在捕获单个命名字段,而不是总是捕获整个标识符。
- 数组的
IntoIterator:array.into_iter()现在按值迭代元素,而不是按引用迭代。 - 宏规则中的 Or 模式现在匹配
:pat中的顶层A|B。 - 默认 Cargo 特性解析器现在是版本 2。
- 添加到 prelude:
TryInto、TryFrom和FromIterator现在默认在作用域内。 - Panic 宏现在总是期望格式字符串,就像
println!()一样。 - 保留语法用于
ident#、ident"..."和ident'...'。 - 警告升级为错误:
bare_trait_objects和ellipsis_inclusive_range_patterns。
闭包中的不连续捕获(Disjoint capture)
闭包会自动捕获主体中使用的标识符的值或引用,但在 2021 版之前,它们总是整体捕获。新的不连续捕获特性可能会简化您编写闭包的方式,让我们看一个快速示例
// 2015 or 2018 edition code
let a = new;
// Move out of one field of the struct
drop;
// Ok: Still use another field of the struct
println!;
// Error: Before 2021 edition, tries to capture all of `a`
let c = ;
c;
为了解决这个问题,您需要在闭包之前手动提取类似 let y = &a.y; 的内容来限制其捕获。从 Rust 2021 版开始,闭包将自动仅捕获它们使用的字段,因此上面的示例可以正常编译!
此新行为仅在新版本中激活,因为它可能会改变字段的丢弃顺序。对于所有版本更改,都有自动迁移可用,通过在闭包内部插入 let _ = &a; 来强制像以前一样捕获整个结构体,从而更新受此影响的闭包。
迁移到 2021 版
指南包含所有新功能的迁移说明,以及通常情况下将现有项目过渡到新版本的指导。在许多情况下,cargo fix 可以自动完成必要的更改。您甚至可能会发现对于 2021 版,您的代码完全无需更改!
尽管这个版本表面上看起来很小,但它仍然是许多贡献者辛勤工作的结果:请参阅我们的专门庆祝和感谢跟踪器!
Cargo rust-version
Cargo.toml 现在支持一个 [package] rust-version 字段,用于指定 crate 支持的最低 Rust 版本,如果未满足该要求,Cargo 将提前报错退出。这目前不影响依赖解析器,但其目的是在兼容性问题演变成晦涩难懂的编译器错误之前将其捕获。
binding @ pattern 中的新绑定
Rust 模式匹配可以写成单个标识符绑定整个值,后跟 @ 和更精细的结构化模式,但这在此模式中不允许额外的绑定——直到现在!
// 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 = matrix;
// Rust 1.56 now lets you bind both at once!
let matrix @ Matrix = get_matrix;
实际上,在 Rust 1.0 之前的时代,这是允许的,但由于当时已知的不健全性而被移除。随着借用检查器自那时以来的演进,并经过严格测试,编译器团队确定这终于可以安全地在 stable Rust 中允许了!
稳定的 API
以下方法和 trait 实现已稳定化。
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 版。没有你们所有人,我们无法做到这一点。感谢!