Rust 1.47.0 版本发布

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

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

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

$ rustup update stable

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

1.47.0 稳定版的新特性

此版本不包含新的语言特性,但增加了一个期待已久的标准库特性。它主要包含生活质量改进、库的稳定化和 const 化,以及工具链的改进。请参阅详细的发布说明,以了解本文未涵盖的其他更改。

更大数组的 Traits

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

我们一直在开发一个名为“const generics”的功能,它允许您对 N 进行泛型化。由于我们尚未稳定 const generics,因此完全解释此功能超出了本文的范围。但是,此功能的核心已在编译器中实现,并且已经决定该功能已足够成熟,我们可以接受标准库使用它来实现任意长度数组的 traits。这在实践中意味着,如果您尝试在 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 中,它将正确打印出数组。

这应该会使数组对大家更有用,尽管这需要等到 const generics 功能稳定后,库才能为其自身的 traits 进行这种实现。我们目前没有 const generics 稳定化的预计日期。

更短的回溯

在 Rust 1.18 中,我们rustc 在 panic 时打印的回溯做了一些更改。回溯中有许多内容在大多数情况下是无用的。然而,在某个时候,这些更改又退回去了。在 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

这使得更容易看到 panic 的实际来源,如果您想查看所有内容,仍然可以设置 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。没有你们大家,我们不可能做到。谢谢!