宣布 Rust 1.47.0

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

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

如果您之前已通过 rustup 安装了 Rust,获取 Rust 1.47.0 就像

$ rustup update stable

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

1.47.0 稳定版中的内容

此版本不包含任何新的语言特性,但它确实添加了一个期待已久的标准库特性。它主要是一些质量改进、库稳定化和常量化,以及工具链改进。查看详细的发布说明,了解本文未涵盖的其他更改。

对更大数组的特征

Rust 目前没有一种方法可以对整数值进行泛型化。这长期以来一直导致数组出现问题,因为数组的类型中包含一个整数;[T; N] 是类型为 T 的长度为 N 的数组的类型。由于无法对 N 进行泛型化,因此您必须为想要支持的每个 N 手动实现数组的特征。对于标准库,决定支持高达 32 的 N

我们一直在开发一项名为“常量泛型”的功能,它允许您对 N 进行泛型化。完全解释此功能超出了本文的范围,因为我们尚未稳定常量泛型。但是,此功能的核心已在编译器中实现,并且已决定该功能已足够成熟,因此我们允许标准库使用它来实现对任何长度的数组的特征。实际上这意味着,如果您尝试在 Rust 1.46 上执行以下操作

fn main() {
    let xs = [0; 34];

    println!("{:?}", xs);
}

您将收到此错误

error[E0277]: arrays only have std trait implementations for lengths 0..=32
 --> src/main.rs:4:22
  |
4 |     println!("{:?}", xs);
  |                      ^^ the trait `std::array::LengthAtMost32` is not implemented for `[{integer}; 34]`
  |
  = note: required because of the requirements on the impl of `std::fmt::Debug` for `[{integer}; 34]`
  = note: required by `std::fmt::Debug::fmt`
  = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

但在 Rust 1.47 中,它将正确打印出数组。

这应该会使数组对人们更有用,尽管在常量泛型功能稳定之前,库才能为自己的特征执行这种类型的实现。我们目前没有关于常量泛型稳定化的预计日期。

更短的回溯

早在 Rust 1.18 中,我们rustc 在恐慌时打印的回溯进行了一些更改。回溯中有很多东西在大多数情况下都没有用。但是,在某个时候,这些内容发生了回归。在 Rust 1.47.0 中,找到了罪魁祸首,并且现在已修复。自回归以来,此程序

fn main() {
    panic!();
}

将为您提供一个看起来像这样的回溯

thread 'main' panicked at 'explicit panic', src/main.rs:2:5
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1076
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1537
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:217
  10: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:526
  11: std::panicking::begin_panic
             at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/panicking.rs:456
  12: playground::main
             at src/main.rs:2
  13: std::rt::lang_start::{{closure}}
             at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/rt.rs:67
  14: std::rt::lang_start_internal::{{closure}}
             at src/libstd/rt.rs:52
  15: std::panicking::try::do_call
             at src/libstd/panicking.rs:348
  16: std::panicking::try
             at src/libstd/panicking.rs:325
  17: std::panic::catch_unwind
             at src/libstd/panic.rs:394
  18: std::rt::lang_start_internal
             at src/libstd/rt.rs:51
  19: std::rt::lang_start
             at /rustc/04488afe34512aa4c33566eb16d8c912a3ae04f9/src/libstd/rt.rs:67
  20: main
  21: __libc_start_main
  22: _start

现在,在 Rust 1.47.0 中,您将看到以下内容

thread 'main' panicked at 'explicit panic', src/main.rs:2:5
stack backtrace:
   0: std::panicking::begin_panic
             at /rustc/d6646f64790018719caebeafd352a92adfa1d75a/library/std/src/panicking.rs:497
   1: playground::main
             at ./src/main.rs:2
   2: core::ops::function::FnOnce::call_once
             at /rustc/d6646f64790018719caebeafd352a92adfa1d75a/library/core/src/ops/function.rs:227

这使得更容易看到恐慌实际上起源于何处,您仍然可以设置 RUST_BACKTRACE=full,如果您想查看所有内容。

LLVM 11

我们已升级到 LLVM 11。编译器仍然支持使用 8 之前的 LLVM 版本进行编译,但默认情况下,您将获得 11。

Windows 上的控制流保护

rustc 现在支持 -C control-flow-guard,这是一个将在 Windows 上启用控制流保护 的选项。其他平台会忽略此标志。

库更改

此外,此版本稳定了九个新的 API

以下先前稳定的 API 现在已变为 const

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

其他更改

Rustdoc 已获得对 Ayu 主题的支持.

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

1.47.0 的贡献者

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