Rust 团队很高兴地宣布 Rust 的新版本 1.79.0。Rust 是一种编程语言,旨在赋能所有人构建可靠且高效的软件。
如果您之前通过 rustup 安装了 Rust,您可以使用以下命令获取 1.79.0:
$ rustup update stable
如果您还没有安装,您可以从我们网站上的相应页面获取 rustup,并查看 1.79.0 的详细发布说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 (rustup default beta) 或 nightly 频道 (rustup default nightly)。请报告您可能遇到的任何错误!
1.79.0 稳定版的新特性
内联 const 表达式
const { ... } 代码块现在在表达式位置稳定,允许显式进入 const 上下文,而无需额外的声明(例如,在 trait 上定义 const 项或关联常量)。
与 const 项 (const ITEM: ... = ...) 不同,内联 const 可以利用作用域内的泛型,并推断其类型而不是显式写入,这使得它们对于内联代码片段特别有用。例如,像这样的模式
const EMPTY: Option<Vec<u8>> = None;
let foo = [EMPTY; 100];
现在可以这样写
let foo = [const { None }; 100];
值得注意的是,这也适用于泛型上下文,在泛型上下文中,以前需要带有关联常量的冗长 trait 声明
fn create_none_array<T, const N: usize>() -> [Option<T>; N] {
[const { None::<T> }; N]
}
这使得这段代码更加简洁易读。
有关详细信息,请参阅参考文档。
关联类型位置的约束
Rust 1.79 稳定了关联项约束语法,它允许我们将约束放在其他约束内的关联类型位置,即 T: Trait<Assoc: Bounds...>。这避免了提供额外的显式泛型类型来约束关联类型的需要。
此功能允许在以前不可能或对用法施加额外、不必要约束的少数几个位置指定约束
where子句 - 在这个位置,这等同于将约束分解为两个(或更多)where子句。例如,where T: Trait<Assoc: Bound>等价于where T: Trait, <T as Trait>::Assoc: Bound。- 超 trait - 通过新语法指定的约束在 trait 被使用时是隐含的,这与 where 子句不同。示例语法:
trait CopyIterator: Iterator<Item: Copy> {}。 - 关联类型项约束 - 这允许约束与 trait 的关联类型关联的嵌套刚性投影。例如
trait Trait { type Assoc: Trait2<Assoc2: Copy>; }。 - 不透明类型约束 (RPIT, TAIT) - 这允许约束与不透明类型关联的关联类型,而无需命名不透明类型。例如,
impl Iterator<Item: Copy>定义了一个 item 是Copy的迭代器,而无需实际命名该 item 约束。
有关更多详细信息,请参阅稳定化报告。
扩展自动临时生命周期延长
在 match 和 if 构造中,立即在构造中引用的临时变量现在会自动延长生命周期。这与块构造中临时变量的生命周期延长行为相同。
例如
let a = if true {
..;
&temp() // used to error, but now gets lifetime extended
} else {
..;
&temp() // used to error, but now gets lifetime extended
};
和
let a = match () {
_ => {
..;
&temp() // used to error, but now gets lifetime extended
}
};
现在与之前的行为一致
let a = {
..;
&temp() // lifetime is extended
};
此行为是向后兼容的,因为这些程序以前编译会失败。
标准库构建中启用帧指针
Rust 项目分发的标准库现在使用 -Cforce-frame-pointers=yes 编译,使下游用户可以更轻松地分析他们的程序。请注意,标准库也继续附带行级调试信息(例如,DWARF),尽管它在 Cargo 的发布配置中默认情况下被剥离。
稳定的 API
{integer}::unchecked_add{integer}::unchecked_mul{integer}::unchecked_sub<[T]>::split_at_unchecked<[T]>::split_at_mut_unchecked<[u8]>::utf8_chunksstr::Utf8Chunksstr::Utf8Chunk<*const T>::is_aligned<*mut T>::is_alignedNonNull::is_aligned<*const [T]>::len<*mut [T]>::len<*const [T]>::is_empty<*mut [T]>::is_emptyNonNull::<[T]>::is_emptyCStr::count_bytesio::Error::downcastnum::NonZero<T>path::absoluteproc_macro::Literal::byte_characterproc_macro::Literal::c_string
这些 API 现在在 const 上下文中是稳定的
Atomic*::into_innerio::Cursor::newio::Cursor::get_refio::Cursor::positionio::emptyio::repeatio::sinkpanic::Location::callerpanic::Location::filepanic::Location::linepanic::Location::column
其他变更
查看 Rust、Cargo 和 Clippy 中的所有变更。
1.79.0 的贡献者
许多人齐心协力创建了 Rust 1.79.0。没有你们所有人,我们不可能做到。谢谢!