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
Ident::new_raw
Range::is_empty
RangeInclusive::is_empty
Result::as_deref
Result::as_deref_mut
Vec::leak
pointer::offset_from
f32::TAU
f64::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。没有你们,我们无法做到。感谢!