时隔 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 长期以来只支持四种配置文件: dev、release、test 和 bench。现在 1.57 版本
支持任意命名的配置文件。
例如,如果你只想在最终产品构建时启用链接时间优化(LTO),可以在 Cargo.toml 添加如下配置
当选择这个配置文件时就可以启用 lto 参数,从而避免了在常规编译时启用它。
[profile.production]
inherits = "release"
lto = true请注意,自定义配置文件必须指定他们要从中继承默认参数的配置文件。自定义配置定义好了之后,
Cargo 构建代码时可以使用参数 --profile production 来指定使用他。当前,会在单独的目录中
构建(本例是 target/production),意味着构建产物不会在目录间共享。
易犯错的内存分配
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_slicecollections::TryReserveErrorHashMap::try_reserveHashSet::try_reserveString::try_reserveString::try_reserve_exactVec::try_reserveVec::try_reserve_exactVecDeque::try_reserveVecDeque::try_reserve_exactIterator::map_whileiter::MapWhileproc_macro::is_availableCommand::getProgramCommand::get_argsCommand::get_envsCommand::get_current_dirCommandArsCommandArgsCommandEnvs
下面是之前稳定的函数现在是 const:
hint::unreachable_unchecked
其它改动
在 1.57 还有些其它改动,具体查看相关改动日志 Rust、Cargo 和 Clippy
1.57.0 的贡献者
有很多人参与了创建 Rust 1.57.0。感谢你们。
