Rust 1.46.0 版本发布

2020 年 8 月 27 日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 新版本 1.46.0 发布。Rust 是一种编程语言,旨在赋能所有人构建可靠且高效的软件。

如果您之前通过 rustup 安装了 Rust,那么升级到 Rust 1.46.0 非常简单,只需运行:

$ rustup update stable

如果您还没有安装 Rust,您可以从我们网站的相应页面获取 rustup,并查看 GitHub 上1.46.0 版本的详细发布说明

1.46.0 稳定版的新特性

此版本在 const fn 中启用了许多新功能,新增了两个标准库 API,以及一个对库作者有用的特性。请参阅详细发布说明,了解本文未涵盖的其他更改。

const fn 改进

现在您可以在 const fn 中使用多项核心语言特性

  • ifif letmatch
  • whilewhile letloop
  • &&|| 运算符

您还可以强制转换为切片

const fn foo() {
  let x = [1, 2, 3, 4, 5];

  // cast the array to a slice
  let y: &[_] = &x;
}

虽然这些特性可能感觉并不,因为您可以在 const fn 之外使用它们,但它们大大增强了编译时计算能力!例如,const-sha1 crate 可以让您在编译时计算 SHA-1 哈希值。这使得 Microsoft 的 Rust WinRT 绑定的性能提高了 40 倍

#[track_caller]

早在三月份,Rust 1.42 版本引入了unwrap 和相关函数发生 panic 时,提供更好的错误消息。当时,我们提到这种实现方式尚未稳定。Rust 1.46 稳定了此特性。

此属性名为 #[track_caller],最初在 2017 年 7 月的 RFC 2091 中提出!如果您正在编写类似 unwrap 这样可能发生 panic 的函数,您可以将此注解放在您的函数上,默认的 panic 格式化程序将使用其调用者作为错误消息中的位置。例如,以下是之前的 unwrap

pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("called `Option::unwrap()` on a `None` value"),
    }
}

现在看起来像这样:

#[track_caller]
pub fn unwrap(self) -> T {
    match self {
        Some(val) => val,
        None => panic!("called `Option::unwrap()` on a `None` value"),
    }
}

就是这样!

如果您自己实现了 panic hook,则可以使用 std::panic::Location 上的 caller 方法来访问此信息。

库变更

延续 const fn 改进的主题,std::mem::forget 现在是一个 const fn。此外,此版本还稳定了两个新的 API:

有关更多信息,请参阅详细发布说明

其他变更

Rust 1.46.0 版本还有其他更改:请查看 RustCargoClippy 中的更改。

1.46.0 版本的贡献者

许多人齐心协力创建了 Rust 1.46.0。没有你们大家,我们不可能做到。感谢!