Rust 1.73.0 版本发布

2023 年 10 月 5 日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 的新版本 1.73.0 发布。Rust 是一种编程语言,旨在赋能所有人构建可靠且高效的软件。

如果您之前通过 rustup 安装了 Rust,可以使用以下命令获取 1.73.0 版本:

$ rustup update stable

如果您还没有安装 rustup,可以从我们网站的相应页面获取 rustup,并查看 GitHub 上 1.73.0 的详细发布说明。

如果您想通过测试未来的版本来帮助我们,可以考虑在本地更新以使用 beta 频道(rustup default beta)或 nightly 频道(rustup default nightly)。请报告您可能遇到的任何错误!

1.73.0 稳定版的新特性

更清晰的 panic 消息

默认 panic 处理程序产生的输出已更改,将 panic 消息放在单独的一行,而不是用引号包裹。这可以使 panic 消息更易于阅读,如本例所示

fn main() {
    let file = "ferris.txt";
    panic!("oh no! {file:?} not found!");
}
Rust 1.73 之前的输出
thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5
Rust 1.73 及之后的输出
thread 'main' panicked at src/main.rs:3:5:
oh no! "ferris.txt" not found!

当消息很长、包含嵌套引号或跨越多行时,这一点尤其有用。

此外,assert_eqassert_ne 产生的 panic 消息也已修改,移动了自定义消息(第三个参数)并删除了一些不必要的标点符号,如下所示

fn main() {
    assert_eq!("🦀", "🐟", "ferris is not a fish");
}
Rust 1.73 之前的输出
thread 'main' panicked at 'assertion failed: `(left == right)`
 left: `"🦀"`,
right: `"🐟"`: ferris is not a fish', src/main.rs:2:5
Rust 1.73 及之后的输出
thread 'main' panicked at src/main.rs:2:5:
assertion `left == right` failed: ferris is not a fish
 left: "🦀"
right: "🐟"

线程局部初始化

正如 RFC 3184 中提议的那样,LocalKey<Cell<T>>LocalKey<RefCell<T>> 现在可以直接使用 get()set()take()replace() 方法进行操作,而无需像通常的 LocalKey 操作那样通过 with(|inner| ...) 闭包。 LocalKey<T>thread_local! 静态变量的类型。

新方法使常用代码更简洁,并避免为新线程中 thread_local! 指定的默认值运行额外的初始化代码。

thread_local! {
    static THINGS: Cell<Vec<i32>> = Cell::new(Vec::new());
}

fn f() {
    // before:
    THINGS.with(|i| i.set(vec![1, 2, 3]));
    // now:
    THINGS.set(vec![1, 2, 3]);

    // ...

    // before:
    let v = THINGS.with(|i| i.take());
    // now:
    let v: Vec<i32> = THINGS.take();
}

稳定的 API

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

其他更改

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

1.73.0 的贡献者

许多人齐心协力创建了 Rust 1.73.0。没有大家,我们无法完成。 谢谢!