宣布 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 stable 版本有什么新特性

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

更大数组上的 Trait

Rust 目前没有办法对整数值进行泛化。这长期以来一直导致数组的问题,因为数组类型中包含一个整数;[T; N] 是长度为 N、元素类型为 T 的数组类型。由于无法对 N 进行泛化,你必须手动为每个想要支持的 N 实现数组的 trait。对于标准库,决定支持的 N 最大值为 32。

我们一直在开发一个名为“常量泛型(const generics)”的特性,它将允许你对 N 进行泛化。完全解释这个特性超出了本文的范围,因为我们还没有稳定常量泛型。然而,该特性的核心部分已在编译器中实现,并且已决定该特性进展顺利,我们可以接受 标准库使用它来实现任意长度数组上的 trait。这在实践中意味着,如果你在 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 中,它将正确地打印出数组。

这应该会使数组对人们来说更有用,尽管需要等到常量泛型特性稳定后,库才能为其自己的 trait 实现这种功能。我们目前没有常量泛型稳定的估计日期。

更短的回溯信息

回溯到 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。编译器仍然支持使用 LLVM 8 或更新版本进行编译,但默认情况下,你将获得 LLVM 11。

Windows 上的 Control Flow Guard

rustc 现在支持 -C control-flow-guard 选项,该选项将在 Windows 上启用 Control Flow Guard。其他平台会忽略此标志。

库的更改

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

以下先前稳定的 API 现在已成为 const 函数

请参阅详细发布说明以了解更多信息。

其他更改

Rustdoc 现在支持 Ayu 主题.

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

1.47.0 贡献者

许多人齐心协力创建了 Rust 1.47.0。没有你们,这一切不可能实现。感谢你们!