宣布 Rust 1.46.0

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

Rust 团队很高兴宣布 Rust 的新版本 1.46.0。Rust 是一种编程语言,它使每个人都能构建可靠高效的软件。

如果您通过 rustup 安装了以前版本的 Rust,获取 Rust 1.46.0 就像

$ rustup update stable

如果您还没有,您可以从我们网站上的相应页面 获取 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]

早在 3 月份,Rust 1.42 的发布引入了 unwrap 和相关函数出现恐慌时,更好的错误消息。当时,我们提到这种实现方式尚未稳定。Rust 1.46 使此功能稳定。

此属性称为 #[track_caller],最初是在 2017 年 7 月的 RFC 2091 中提出的!如果您正在编写像 unwrap 这样的可能出现恐慌的函数,您可以在函数上添加此注释,默认的恐慌格式化程序将使用其调用者作为其错误消息中的位置。例如,以下是之前的 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"),
    }
}

就是这样!

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

库更改

为了配合 const fn 改进,std::mem::forget 现在是一个 const fn。此外,此版本稳定了两个新的 API

查看 详细的发布说明以了解更多信息。

其他更改

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

1.46.0 的贡献者

许多人共同创建了 Rust 1.46.0。没有你们,我们无法做到。 感谢!