Rust 1.49.0 版本发布

2020年12月31日 · Rust 发布团队

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

如果你之前通过 rustup 安装了 Rust,那么获取 Rust 1.49.0 版本非常简单,只需:

$ rustup update stable

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

1.49.0 稳定版的新特性

在此版本中,我们添加了一些新的目标平台,并改进了测试框架。请参阅详细发布说明以了解本文未涵盖的其他更改。

64 位 ARM Linux 达到 Tier 1 级别

Rust 编译器支持各种各样的目标平台,但 Rust 团队无法为所有平台提供相同级别的支持。为了清楚地标明每个目标平台的支持程度,我们使用分级系统。

  • Tier 3 级别的目标平台在技术上受编译器支持,但我们不检查其代码是否可以构建或通过测试,并且我们不提供任何预构建的二进制文件作为发布的一部分。
  • Tier 2 级别的目标平台保证可以构建,并且我们提供预构建的二进制文件,但我们不在这些平台上执行测试套件:生成的二进制文件可能无法工作或可能存在错误。
  • Tier 1 级别的目标平台提供最高的支持保证,并且对于编译器中合并的每个更改,我们都会在这些平台上运行完整的测试套件。预构建的二进制文件也可用。

Rust 1.49.0 将 aarch64-unknown-linux-gnu 目标平台提升至 Tier 1 支持级别,为运行 Linux 的 64 位 ARM 系统的用户带来了我们最高的支持保证!我们希望此更改将有益于从嵌入式系统到桌面和服务器的工作负载。

这是该项目的一个重要里程碑,因为这是首次有非 x86 目标平台达到 Tier 1 支持级别:我们希望这将为更多目标平台在未来达到我们的最高级别铺平道路。

请注意,Android 不受此更改的影响,因为它使用不同的 Tier 2 目标平台。

64 位 ARM macOS 和 Windows 达到 Tier 2 级别

Rust 1.49.0 还新增了两个达到 Tier 2 支持级别的目标平台:

  • aarch64-apple-darwin 目标平台为 Apple M1 系统上的 Rust 带来了支持。
  • aarch64-pc-windows-msvc 目标平台为运行 Windows on ARM 的 64 位 ARM 设备上的 Rust 带来了支持。

从现在开始,开发人员可以期待这两个目标平台都提供可通过 rustup 安装的预构建二进制文件!但 Rust 团队未在这些平台上运行测试套件,因此可能存在错误或不稳定性。

测试框架捕获线程中的输出

Rust 的内置测试框架没有很多功能,但这并不意味着它不能改进!考虑一个如下所示的测试:

#[test]
fn thready_pass() {
    println!("fee");
    std::thread::spawn(|| {
        println!("fie");
        println!("foe");
    })
    .join()
    .unwrap();
    println!("fum");
}

这是在 Rust 1.49.0 之前运行此测试的样子:

❯ cargo +1.48.0 test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.38s
     Running target\debug\deps\threadtest-02f42ffd9836cae5.exe

running 1 test
fie
foe
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

你可以看到来自线程的输出被打印出来,并与测试框架本身的输出混合在一起。如果每个 println! 都像打印 "fum" 的那个一样工作,岂不是更好吗?嗯,这正是 Rust 1.49.0 中的行为。

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

但不用担心;如果测试失败,你仍然会看到所有输出。通过在测试末尾添加 panic!,我们可以看到失败是什么样的。

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... FAILED

failures:

---- thready_pass stdout ----
fee
fie
foe
fum
thread 'thready_pass' panicked at 'explicit panic', src\lib.rs:11:5

具体来说,测试运行器确保捕获输出,并在测试失败时保存它。

库变更

在 Rust 1.49.0 中,有三个新的稳定函数:

还有两个函数被设为 const

请参阅详细发布说明以了解其他更改。

其他更改

Rust 1.49.0 版本中还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改。 (Rust, Cargo, and Clippy.)

1.49.0 版本的贡献者

许多人齐心协力创建了 Rust 1.49.0 版本。没有你们大家,我们不可能做到。谢谢! (Thanks!)