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 上尝试执行类似以下操作
你会得到这个错误
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 中,找到了原因,并且现在已经修复。自退步以来,以下程序
会给你一个看起来像这样的回溯信息
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
Ident::new_rawRange::is_emptyRangeInclusive::is_emptyResult::as_derefResult::as_deref_mutVec::leakpointer::offset_fromf32::TAUf64::TAU
以下先前稳定的 API 现在已成为 const 函数
- 所有
NonZero整数的new方法。 - 所有整数的
checked_add,checked_sub,checked_mul,checked_neg,checked_shl,checked_shr,saturating_add,saturating_sub, 和saturating_mul方法。 - 所有有符号整数的
checked_abs,saturating_abs,saturating_neg, 和signum方法。 char和u8的is_ascii_alphabetic,is_ascii_uppercase,is_ascii_lowercase,is_ascii_alphanumeric,is_ascii_digit,is_ascii_hexdigit,is_ascii_punctuation,is_ascii_graphic,is_ascii_whitespace, 和is_ascii_control方法。
请参阅详细发布说明以了解更多信息。
其他更改
Rust 1.47.0 版本还有其他更改:请查看 Rust、Cargo 和 Clippy 中的更改内容。
1.47.0 贡献者
许多人齐心协力创建了 Rust 1.47.0。没有你们,这一切不可能实现。感谢你们!