Rust 1.51.0 稳定版本改进介绍

2022-06-30 16:38:33 浏览数 (1)

上午查阅 Rust 官网内部博客,看到 Rust 1.51.0 stable 预发布版本已经开放测试。正式发布版本定于 UTC 标准时 2021-03-25,北京时间估计要到本周五。

因为还未正式发布,不能从 Rust 国内工具链镜像源获取,需要从 https://dev-static.rust-lang.org 站点下载,您可以运行如下命令安装 Rust 1.51.0 到本地系统:

  • Linux、macOS
代码语言:javascript复制
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable

  • Windows
代码语言:javascript复制
set RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org
rustup update stable

安装后,可以看到 rustccargo 的版本号。

代码语言:javascript复制
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 类型。例如,现在您可以编写如下代码(来自于官网内部博客实例):
代码语言:javascript复制
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-gnuaarch64-unknown-linux-gnu_ilp32,以及 aarch64_be-unknown-linux-gnu_ilp32tier 3* 支持。
  • 添加了对 i386-unknown-linux-gnui486-unknown-linux-gnutier 3 支持。
  • CPUs 特性侦测方面,增加了选项 target-cpu=native
  • 当与 LLVM 11.0.1 一起使用时,Rust 现在将使用 inline-asm 对堆栈侦测。

类库

  • Box::downcast 也实现了所有 dyn Any Send Sync 对象。
  • str 实现了 AsMut<str>
  • u64u128 实现了 From<char>
  • &T 实现了 Error,其中 TError 的具体实现。
  • 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

0 人点赞