Rust 团队很高兴发布新版本 Rust 1.65.0。Rust 是一种赋能每个人构建可靠且高效软件的编程语言。
在深入了解新版本 Rust 的细节之前,我们想提请大家关注伊朗宗教道德警察造成的悲惨的 Mahsa Amini 之死 以及许多其他人的死亡和暴力镇压。更多详情请参阅 https://en.wikipedia.org/wiki/Mahsa_Amini_protests。我们与在伊朗争取人权的人民站在一起。
如果你已经通过 rustup 安装了旧版本的 Rust,可以使用以下命令获取 1.65.0:
$ rustup update stable
如果你还没有安装,可以从我们网站上相应的页面 获取 rustup,并在 GitHub 上查看 1.65.0 的详细发布说明。
如果你想通过测试未来的版本来帮助我们,可以考虑在本地更新以使用 beta 通道 (rustup default beta) 或 nightly 通道 (rustup default nightly)。请报告你遇到的任何错误!
1.65.0 稳定版中的内容
泛型关联类型 (GATs)
生命周期、类型和 const 泛型现在可以在关联类型上定义,如下所示:
很难用简单的词语来形容这些有多么有用,所以这里提供一些示例 trait,以便感受它们的强大:
/// An `Iterator`-like trait that can borrow from `Self`
/// Can be implemented over smart pointers, like `Rc` or `Arc`,
/// in order to allow being generic over the pointer type
/// Allows borrowing an array of items. Useful for
/// `NdArray`-like types that don't necessarily store
/// data contiguously.
如你所见,GATs 功能非常多样化,并支持许多目前无法编写的模式。更多信息,请查阅去年发布的宣布 推进稳定化 的博文,或上周发布的 稳定化公告博文。前者对上面的一些示例进行了更深入的阐述,而后者则讨论了本次稳定化的一些已知限制。
更深入的阅读可以在 nightly 参考手册的关联类型部分或 原始 RFC(该 RFC 最初于 6 年半前开放!)中找到。
let-else 语句
这引入了一种新的 let 语句类型,带有可驳回模式(refutable pattern)和一个发散(diverging)的 else 块,当模式不匹配时执行。
let PATTERN: TYPE = EXPRESSION else {
DIVERGING_CODE;
};
普通的 let 语句只能使用不可驳回模式(irrefutable patterns),即在静态分析时已知总是匹配的模式。这种模式通常只是一个单一的变量绑定,但也可能解构复合类型,如结构体、元组和数组。然而,这不能用于条件匹配,比如提取枚举的一个变体——直到现在!有了 let-else,可驳回模式可以像普通的 let 一样匹配并在周围作用域中绑定变量,或者在模式不匹配时发散(例如 break、return、panic!)。
assert_eq!;
名称绑定的作用域是它与 match 或 if let-else 表达式的主要区别。以前你可以通过一些不幸的重复和一个外部 let 来近似这些模式:
let = match ;
let count = if let Ok = u64from_str else ;
从带标签的块中 break
普通的块表达式现在可以被标记为 break 的目标,从而提前终止该块。这听起来可能有点像 goto 语句,但它不是任意跳转,而只能从块内部跳转到块的末尾。这在使用 loop 块时已经可能实现,你可能已经看到有人编写只执行一次的循环,仅仅是为了获得一个带标签的 break。
现在有了一个专门为此设计的语言特性!带标签的 break 还可以包含一个表达式值,就像循环一样,允许一个多语句块拥有一个提前的“返回值”。
let result = 'block: ;
分割 Linux 调试信息
早在 Rust 1.51 中,编译器团队就添加了对 macOS 上分割调试信息的支持,现在这个选项在 Linux 上也稳定可用了。
-Csplit-debuginfo=unpacked会将调试信息分割到多个.dwoDWARF 目标文件中。-Csplit-debuginfo=packed会在你输出的可执行文件旁边生成一个单独的.dwpDWARF 包,其中包含了所有的调试信息。-Csplit-debuginfo=off仍然是默认行为,它将 DWARF 数据包含在目标文件和最终二进制文件的.debug_*ELF 段中。
分割 DWARF 使链接器可以避免处理调试信息(因为它不再位于被链接的目标文件中),这可以加快链接速度!
其他目标现在也接受 -Csplit-debuginfo 作为稳定选项,使用其平台特定的默认值,但指定其他值仍不稳定。
稳定化的 API
以下方法和 trait 实现现已稳定化:
std::backtrace::BacktraceBound::as_refstd::io::read_to_string<*const T>::cast_mut<*mut T>::cast_const
特别值得注意的是,Backtrace API 允许在任何时候捕获堆栈回溯,它使用与通常用于 panic 回溯相同的平台特定实现。例如,这对于为错误类型添加运行时上下文可能很有用。
这些 API 现在可在 const 上下文中使用:
兼容性说明
- 作为 RLS 弃用的最后一步,此版本已将 RLS 替换为一个显示弃用警告的小型 LSP 服务器,建议用户迁移到
rust-analyzer。
其他变化
Rust 1.65 版本中还有其他变化,包括:
- 对于优化编译,MIR 内联现在已启用。这为实际项目(crates)提供了 3-10% 的编译时间改进。
- 在调度构建时,Cargo 现在会对手头任务队列进行排序以提高性能。
查看 Rust、Cargo 和 Clippy 中所有更改的详细信息。
1.65.0 的贡献者
许多人齐心协力创造了 Rust 1.65.0。没有你们大家,这是不可能的。感谢!