Rust 1.79.0 发布

2024年6月13日 · Rust 发布团队

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 约束。

有关更多详细信息,请参阅稳定化报告

扩展自动临时生命周期延长

matchif 构造中,立即在构造中引用的临时变量现在会自动延长生命周期。这与块构造中临时变量的生命周期延长行为相同。

例如

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

这些 API 现在在 const 上下文中是稳定的

其他变更

查看 RustCargoClippy 中的所有变更。

1.79.0 的贡献者

许多人齐心协力创建了 Rust 1.79.0。没有你们所有人,我们不可能做到。谢谢!