发布 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 上下文,而无需额外的声明(例如,定义 const 项或 trait 上的关联常量)。

与 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> 定义了一个其项为 Copy 的迭代器,而无需实际命名该项界限。

更多详情请参阅稳定化报告。

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

在构造中立即被引用的临时值现在在 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 的 release profiles 中默认会被剥离。

稳定化的 API

这些 API 现在在 const 上下文中稳定可用

其他变更

查看 Rust、Cargo 和 Clippy 中的所有变更。

1.79.0 的贡献者

许多人共同努力创建了 Rust 1.79.0。没有你们所有人,我们不可能完成。谢谢!