Rust 1.57 稳定版发布了

Rust语言2021-12-03

https://blog.rust-lang.org/2021/12/02/Rust-1.57.0.html

时隔 6 周,Rust 1.57.0 stable 她来了,新特性一览:

const 上下文支持 panic!

早期版本的 Rust,panic! 宏不能在 const fn 或其它运行时上下文中。这个版本他稳定可用了。 和 panic! 一起还有一些其它标准库 API 也能在 const 中使用了,如 assert!

panic! 宏当前版本还不支持完整的格式化,必须用一个静态字符串调用(panic!("")), 或使用带 {} (不能使用格式说明或其它特征)的 &str 类型插值。

未来相关功能会有更多支持,但就目前这个最小稳定版已经可以使用编译时断言了,如验证类型大小:

const _: () => assert!(std::mem::size_of::<u64>() == 8);
const _: () => assert!(std::mem::size_of::<u8>() == 1);

Cargo 支持自定义配置文件

Cargo 长期以来只支持四种配置文件: devreleasetestbench。现在 1.57 版本 支持任意命名的配置文件。

例如,如果你只想在最终产品构建时启用链接时间优化(LTO),可以在 Cargo.toml 添加如下配置 当选择这个配置文件时就可以启用 lto 参数,从而避免了在常规编译时启用它。

[profile.production]
inherits = "release"
lto = true

请注意,自定义配置文件必须指定他们要从中继承默认参数的配置文件。自定义配置定义好了之后, Cargo 构建代码时可以使用参数 --profile production 来指定使用他。当前,会在单独的目录中 构建(本例是 target/production),意味着构建产物不会在目录间共享。

易犯错的内存分配

Rust 1.57 为 VecStringHashMapHashSetVecDeque 稳定了 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::getProgram
  • Command::get_args
  • Command::get_envs
  • Command::get_current_dir
  • CommandArs
  • CommandArgs
  • CommandEnvs

下面是之前稳定的函数现在是 const

  • hint::unreachable_unchecked

其它改动

在 1.57 还有些其它改动,具体查看相关改动日志 RustCargoClippy

1.57.0 的贡献者

有很多人参与了创建 Rust 1.57.0。感谢你们