宣布 Rust 1.49.0

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

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

如果您之前通过 rustup 安装了 Rust 的旧版本,获取 Rust 1.49.0 非常简单,只需

$ rustup update stable

如果您还没有安装,您可以从我们网站上的相应页面获取 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 目标为运行 ARM 上的 Windows 的 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 版本中还有其他更改:查看RustCargoClippy 中的更改。

1.49.0 的贡献者

许多人共同创建了 Rust 1.49.0。没有你们,我们不可能做到。 感谢!