Rust 团队很高兴发布新版本 Rust 1.42.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您已经通过 rustup 安装了 Rust 的先前版本,那么获取 Rust 1.42.0 就像这样简单
$ rustup update stable
如果您还没有安装 rustup,可以从我们网站的相应页面获取 rustup,并在 GitHub 上查阅 1.42.0 的详细发行说明。
1.42.0 稳定版有什么新内容
Rust 1.42.0 的亮点包括:在 unwrap 时更实用的 panic 消息、子切片模式、废弃 Error::description 等。请参阅详细发行说明以了解此文未涵盖的其他更改。
Option 和 Result panic 消息中实用的行号
在 Rust 1.41.1 中,对 Option::None 值调用 unwrap() 会产生一个错误消息,看起来像这样
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /.../src/libcore/macros/mod.rs:15:40
类似地,由 unwrap_err、expect 和 expect_err 生成的 panic 消息中的行号,以及 Result 类型上的相应方法,也都指向 core 的内部实现。
在 Rust 1.42.0 中,所有这八个函数都会产生提供调用发生位置行号的 panic 消息。新的错误消息看起来像这样
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:2:5
这意味着对 unwrap 的无效调用发生在 src/main.rs 的第 2 行。
此行为通过一个注解 #[track_caller] 实现。这个注解尚未在稳定的 Rust 中可用;如果您有兴趣在自己的代码中使用它,可以通过关注此跟踪 issue来了解其进展。
子切片模式
在 Rust 1.26 中,我们稳定了“切片模式”,它允许您对切片进行 match。它们看起来像这样
这允许您对切片进行匹配,但相当有限。您必须选择想要支持的精确大小,并且必须为不想支持的大小提供一个包罗万象的分支。
在 Rust 1.42 中,我们扩展了对切片部分进行匹配的支持
.. 称为“剩余模式”,因为它匹配切片的其余部分。上面的例子在切片的末尾使用了剩余模式,但您也可以以其他方式使用它
如果您有兴趣了解更多信息,我们在Inside Rust 博客上发布了一篇文章,讨论了这些更改以及将来可能引入稳定版的更多模式匹配改进!您还可以在Thomas Hartmann 的文章中阅读有关切片模式的更多信息。
matches!
此版本的 Rust 稳定了一个新宏,matches!。该宏接受一个表达式和一个模式,如果模式匹配表达式,则返回 true。换句话说
// Using a match expression:
match self.partial_cmp
// Using the `matches!` macro:
matches!
您还可以使用诸如 | 模式和 if 守卫之类的特性
let foo = 'f';
assert!;
let bar = Some;
assert!;
use proc_macro::TokenStream; 现在可用
在 Rust 2018 中,我们移除了对 extern crate 的需要。但过程宏有些特殊,因此在编写过程宏时,您仍然需要写 extern crate proc_macro;。
在此版本中,如果您使用 Cargo,在使用 2018 版时不再需要这一行;您可以像使用其他任何 crate 一样使用 use。鉴于大多数项目已经有一行类似于 use proc_macro::TokenStream; 的代码,这一变化意味着您可以删除 extern crate proc_macro; 这一行,并且您的代码仍然可以工作。这一变化很小,但使过程宏更接近常规代码。
库
iter::Empty<T>现在为任何T实现Send和Sync。Pin::{map_unchecked, map_unchecked_mut}不再要求返回类型实现Sized。io::Cursor现在实现PartialEq和Eq。Layout::new现在是const。
稳定化的 API
CondVar::wait_while和CondVar::wait_timeout_whileDebugMap::key和DebugMap::valueManuallyDrop::takeptr::slice_from_raw_parts_mut和ptr::slice_from_raw_parts
其他更改
Rust 1.42.0 版本中还有其他更改:请查看Rust、Cargo 和Clippy 中有哪些变化。
兼容性说明
本版本有两项值得注意的兼容性说明:标准库中的一项废弃,以及 32 位 Apple 目标的降级至 Tier 3。
Error::Description 已废弃
有时,会犯错误。Error::description 方法现在被认为是其中一个错误。问题在于它的类型签名
由于 description 返回 &str,它的实用性远不如我们期望的。这意味着您基本上需要原样返回 Error 的内容;如果您想说,使用格式化来产生一个更漂亮的描述,那是不可能的:您需要返回一个 String。相反,错误类型应该实现 Display/Debug trait 来提供错误的描述。
这个 API 自 Rust 1.0 起就存在了。我们为此目标努力了很长时间:早在 Rust 1.27 中,我们就“软废弃”了此方法。这在实践中意味着,我们给了该函数一个默认实现。这意味着用户在实现 Error trait 时不再被迫实现此方法。在此版本中,我们将其标记为*实际*废弃,并采取了一些步骤来淡化 Error 文档中的该方法。由于我们的稳定性策略,description 永远不会被移除,因此这是我们能做到的极限了。
32 位 Apple 目标的降级
Apple 不再支持 32 位目标,因此我们也不再支持。它们已被项目降级到 Tier 3 支持。有关更多详细信息,请参阅1 月份发布的这篇文章,其中详细介绍了所有内容。
1.42.0 的贡献者
许多人共同努力创建了 Rust 1.42.0。没有各位的付出,我们不可能做到。 感谢!