在 2024 年 6 月 13 日,Rust 团队又发布 Rust 1.79.0 新版本了,一起来看看该版本到底发生了哪些变化吧。对于喜欢尝新的伙伴,又可以体验到更多的创新和改进了。
老规则,如果你渴望尝试最新版本的 Rust,只需通过 rustup 工具即可轻松升级。老规则,如果你渴望尝试最新版本的 Rust,只需通过 rustup 工具即可轻松升级。
$ rustup update stable
新的 1.79.0 稳定版中包含了哪些内容呢?
尽管 Rust 1.79. 0 版本在规模上相对较小,但它仍然秉承了Rust 团队一贯的风格呀,哈哈!即使是细微的更新也能汇聚成显著的进步。
内联 const 表达式
在 Rust 1.79.0 版本中,内联 const 表达式被稳定化,内联 const 表达式允许在表达式位置上使用 const 块,而无需进行额外的声明。
这样的常量代码更加简洁和可读,尤其是在泛型上下文中,以前你可能需要先声明一个 const 常量,然后再使用它。然而现在你就能直接在需要的地方使用 const 块来创建常量值。
之前的写法:
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
现在可以写成:
let foo = [const { None }; 100];
需要注意的是,这对于通用上下文也是如此,以前需要使用关联常量的详细特征声明:
fn create_none_array<T, **const** N: usize>() -> [Option<T>; N] {
[**const** { None::<T> }; N]
}
这种改进也适用于泛型上下文,以前需要使用关联常量的详细特征声明,现在可以直接使用内联 const 表达式,无需额外声明,使得代码更加简洁性,还增强表达能力,易于阅读。
关联类型位置的 Bound
在 Rust 1.79 稳定中了关联项边界语法,使得能够将边界放在其他边界内的关联类型位置,即 T: Trait<Assoc: Bounds...>。这样就避免了仅为了约束关联类型而提供额外的显式泛型类型的需要。该功能允许在一些以前不可能或对使用施加了额外的、不必要的限制的地方指定界限,譬如:
where 子句
在这个位置上,相当于将边界分成两个(或多个)where 子句。譬如:
where T:Trait<Assoc: Bound>
相当于:
where T: Trait, <T as Trait>::Assoc: Bound
更多的可以阅读官网文档获取。
延长自动临时寿命延长
Rust 1.79.0 稳定版改进了生命周期处理,使得 match 和 if 表达式中的临时项自动获得更长的生命周期。
let a = if true {
// 假设这是一个临时值
let temp = create_temp_value();
&temp // 引用临时值
} else {
// 引用另一个临时值
&create_temp_value()
};
再来看 match 的构造:
let a = match () {
_ => {
..;
&temp()
}
}
现在与之前的行为一致:
let a = {
..;
&temp() // lifetime is extended
};
此行为是向后兼容的,因为这些程序过去编译失败。
当然还有了,还有一些稳定API等等,更多建议多关注官网动态,才能获取一些实时性信息。