[Rust] Rust 1.51.0 稳定版本改进介绍
💥 内容涉及著作权,均归属作者本人。若非作者注明,默认欢迎转载:请注明出处,及相关链接。
Summary: Rust 1.51.0 将于本周发布,改进包括语法、编译器、类库、已稳定 APIs、Cargo、Rustdoc、Misc,以及兼容性等方面。
上午查阅 Rust 官网内部博客,看到 Rust 1.51.0 stable 预发布版本已经开放测试。正式发布版本定于 UTC 标准时 2021-03-25,北京时间估计要到本周五。
因为还未正式发布,不能从 Rust 国内工具链镜像源获取,需要从 https://dev-static.rust-lang.org
站点下载,您可以运行如下命令安装 Rust 1.51.0 到本地系统:
- Linux、macOS
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable
- Windows
set RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org
rustup update stable
安装后,可以看到 rustc
和 cargo
的版本号。
rustc -V; cargo -V
rustc 1.51.0 (2fd73fabe 2021-03-23)
cargo 1.51.0 (43b129a20 2021-03-16)
关于 Rust 工具链的国内源,可以参阅《配置 Rust 工具链的国内源》。
Rust 1.51.0 改进包括语法、编译器、类库、稳定 APIs、Cargo、Rustdoc、Misc,以及兼容性等方面。
语法改进
常量泛型(const generics)
。 Rust 1.51.0 中,对可以通过常量值参数化的项做了改进。现在,除了类型(type)和生命周期(lifetime)之外,还包括函数、trait,以及结构体。但目前只允许原始整数类型、布尔型,以及 char 类型。例如,现在您可以编写如下代码(来自于官网内部博客实例):
struct GenericArray<T, const LENGTH: usize> {
inner: [T; LENGTH]
}
impl<T, const LENGTH: usize> GenericArray<T, LENGTH> {
const fn last(&self) -> Option<&T> {
if LENGTH == 0 {
None
} else {
Some(&self.inner[LENGTH - 1])
}
}
}
编译器
- macOS平台编译器改进:添加了选项
-Csplit-debuginfo codegen
。此选项控制调试信息是跨多个文件拆分,还是打包到单个文件中。需要注意的是:此选项在其他平台上还不稳定。 - 添加了对
aarch64_be-unknown-linux-gnu
、aarch64-unknown-linux-gnu_ilp32
,以及aarch64_be-unknown-linux-gnu_ilp32
的tier 3*
支持。 - 添加了对
i386-unknown-linux-gnu
和i486-unknown-linux-gnu
的tier 3
支持。 - CPUs 特性侦测方面,增加了选项
target-cpu=native
。 - 当与
LLVM 11.0.1+
一起使用时,Rust 现在将使用inline-asm
对堆栈侦测。
类库
Box::downcast
也实现了所有dyn Any + Send + Sync
对象。str
实现了AsMut<str>
。u64
和u128
实现了From<char>
。- 为
&T
实现了Error
,其中T
为Error
的具体实现。 - 为
Poll<Option<Result<T, E>>>
实现了Poll::{map_ok, map_err}
。 - 所有有符号整数类型,都实现了
unsigned_abs
。 io::Empty
实现了io::Seek
。- 为
T: ?Sized
类型,实现了rc::Weak<T>
和sync::Weak<T>
的方法,如as_ptr
。
已稳定 APIs
Arc::decrement_strong_count
Arc::increment_strong_count
Once::call_once_force
Peekable::next_if_eq
Peekable::next_if
Seek::stream_position
array::IntoIter
panic::panic_any
ptr::addr_of!
ptr::addr_of_mut!
slice::fill_with
slice::split_inclusive_mut
slice::split_inclusive
slice::strip_prefix
slice::strip_suffix
str::split_inclusive
sync::OnceState
task::Wake
Cargo
- 添加了
split-debuginfo
选项,以控制-Csplit-debuginfo codegen
选型。 Cargo.toml
文件中,添加了resolver
域,以启用新的特性解析器和 CLI 执行选项。Cargo 的第二代版本中,将尝试避免统一那些可能不需要的依赖特性。例如,在构建脚本和过程宏中,对std
特性的使用,有相同的依赖关系。而在最终二进制文件中,却使用了no-std
特性。
Rustdoc
- Rustdoc 将包括
Deref
trait 中的可用方法的文档。 - 可以提供一个标志
--default-theme
,用于设置文档的默认主题。
文档内部链接的各种改进:
- 可以连接到自动产生的非路径主体,如
slice
。 - 链接到关联项。
- 选项链接方面,包括了泛型参数,如
Vec<T>
。
Misc
- 可给测试传递参数
--include-ignored
(例如,cargo test -- --include-ignored
),以包含标记为#[ignore]
的测试。
兼容性说明
- WASI 平台不再使用
wasm-bindgen
ABI,而代替为 wasm32 ABI。 rustc
不再对可能失败的const
进行除法、取模和索引操作。- 对于分布式工件,以下平台的
glibc
最低版本已经升级到 2.31。armv5te-unknown-linux-gnueabi
sparc64-unknown-linux-gnu
thumbv7neon-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabi
x86_64-unknown-linux-gnux32
内置
- 不执行
codegen
时,始终避免构建优化的MIR
。
官网链接:1.51.0 pre-release testing
谢谢您的阅读。