前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust 1.51.0 稳定版本改进介绍

Rust 1.51.0 稳定版本改进介绍

作者头像
niqin.com
发布2022-06-30 16:38:33
8340
发布2022-06-30 16:38:33
举报
文章被收录于专栏:Rust 生态与实践

上午查阅 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust 生态与实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法改进
  • 编译器
  • 类库
  • 已稳定 APIs
  • Cargo
  • Rustdoc
  • Misc
  • 兼容性说明
  • 内置
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档