发布 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 stable 版本有什么新变化

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

const fn 改进

几个核心语言特性你现在可以在 const fn 中使用:

  • if, if let, 和 match
  • while, while let, 和 loop
  • &&|| 运算符

你还可以转换为 slice

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。没有大家的支持,这一切是不可能实现的。感谢大家!