Rust 新版本1.57.0发布,功能更新速览

12月2日,Rust官方博客发文称Rust 1.57.0正式发布。

开发者如果想要使用最新版本的Rust,方法也很简单:若是已经通过rustup安装了以前版本的Rust,那么只需要通过以下代码进行更新:rustup update stable。若是没有安装过,那么就可以查看这个文档进行安装

Rust 1.57.0更新内容:

panic! in const contexts

在以前的Rust版本中,panic!宏在const fn和其他编译时上下文中是不可用的。现在,这一点已经稳定下来了。连同panic!的稳定,其他几个标准库的API现在也可以在const中使用,比如assert!。

这个稳定化还不包括完整的格式化基础设施,所以必须用静态字符串(panic!("..."))或者用单一的&str插值(panic!("{}", a))来调用panic!宏,它必须与{}一起使用(没有格式指定器或其他特征)。

未来这种支持可能会扩大,但现在其实也已经可以实现直接的编译时断言,例如验证一个类型的大小。

const _: () = assert! (std::mem::size_of::() == 8)。

const _: () = assert!(std::mem::size_of::() ==1)。

Cargo对自定义配置文件的支持

Cargo长期以来一直支持四个配置文件:dev、release、test和bench。在Rust 1.57中,增加了对任意命名配置文件的支持。

例如,如果你想只在最终生产构建时启用 link time optimizations (LTO),那么在Cargo.toml中添加以下片段,在选择此配置文件时启用lto标志,但要注意不能在常规发布构建时启用它。

[profile.production]

inherits = "release"

lto = true

请注意,自定义配置文件必须指定一个配置文件,它们从该配置文件继承默认设置。一旦定义了配置文件,构建代码的Cargo命令就可以用--profile production来要求使用它。目前,这将在一个单独的目录(本例中为target/production)中构建工件,这意味着工件不会在目录之间共享。

Fallible allocation

Rust 1.57为Vec、String、HashMap、HashSet和VecDeque稳定了try_reserve。这个API使调用者能够错误地分配这些类型的支持存储。

如果全局分配器失败,Rust通常会中止这个过程,这并不总是可取的。这个API提供了一种方法,可以在使用标准库集合时避免这种中止。然而,Rust并不保证返回的内存实际上是由内核分配的:例如,如果在Linux上启用了超额提交(overcommit),当试图使用时,内存可能并不可用。

目前稳定的API

  • [T; N]::as_mut_slice
  • [T; N]::as_slice
  • collections::TryReserveError
  • HashMap::try_reserve
  • HashSet::try_reserve
  • String::try_reserve
  • String::try_reserve_exact
  • Vec::try_reserve
  • Vec::try_reserve_exact
  • VecDeque::try_reserve
  • VecDeque::try_reserve_exact
  • Iterator::map_while
  • iter::MapWhile
  • proc_macro::is_available
  • Command::get_program
  • Command::get_args
  • Command::get_envs
  • Command::get_current_dir
  • CommandArgs
  • CommandEnvs
2