Rust 1.61.0 发布

2022 年 5 月 19 日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 的新版本 1.61.0。Rust 是一种编程语言,它使每个人都能构建可靠且高效的软件。

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

$ rustup update stable

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

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

1.61.0 稳定版中的新特性

main 返回自定义退出代码

最初,Rust 的 main 函数只能返回单元类型 ()(隐式或显式),始终表示退出状态成功,如果需要其他状态,则必须调用 process::exit(code)。自 Rust 1.26 以来,main 允许返回 Result,其中 Ok 转换为 C 的 EXIT_SUCCESS,而 Err 转换为 EXIT_FAILURE(也会调试打印错误)。在底层,这些替代返回类型通过不稳定的 Termination trait 统一起来。

在此版本中,Termination trait 最终稳定了,同时还有一个更通用的 ExitCode 类型,它包装了特定于平台的返回类型。它具有 SUCCESSFAILURE 常量,并且还实现了 From<u8> 以支持更任意的值。Termination trait 也可以为您自己的类型实现,允许您在转换为 ExitCode 之前自定义任何类型的报告。

例如,以下是一种为 git bisect run 脚本编写类型安全的退出代码的方法

use std::process::{ExitCode, Termination};

#[repr(u8)]
pub enum GitBisectResult {
    Good = 0,
    Bad = 1,
    Skip = 125,
    Abort = 255,
}

impl Termination for GitBisectResult {
    fn report(self) -> ExitCode {
        // Maybe print a message here
        ExitCode::from(self as u8)
    }
}

fn main() -> GitBisectResult {
    std::panic::catch_unwind(|| {
        todo!("test the commit")
    }).unwrap_or(GitBisectResult::Abort)
}

const fn 的更多功能

在此版本中,为了在 const 函数中启用更多功能,稳定了几个增量特性

  • fn 指针的基本处理:您现在可以在 const fn 中创建、传递和转换函数指针。例如,这对于为解释器构建编译时函数表可能很有用。但是,仍然不允许调用 fn 指针。

  • Trait 约束:您现在可以在 const fn 的泛型参数上编写 trait 约束,例如 T: Copy,以前只允许 Sized

  • dyn Trait 类型:类似地,const fn 现在可以处理 trait 对象,dyn Trait

  • impl Trait 类型const fn 的参数和返回值现在可以是 opaque impl Trait 类型。

请注意,trait 特性尚不支持在 const fn 中调用这些 trait 的方法。

请参阅参考书的常量求值部分,以了解有关 const 上下文当前功能的更多信息,以及可以在rust#57563 中跟踪未来功能。

锁定 stdio 的静态句柄

三个标准的 I/O 流 -- StdinStdoutStderr -- 每个都有一个 lock(&self),以便更好地控制读取和写入的同步。但是,它们返回的锁保护器的生命周期是从 &self 借用的,因此它们被限制在原始句柄的范围内。这被认为是不必要的限制,因为底层的锁实际上是在静态存储中,所以现在返回的保护器的生命周期为 'static,与句柄断开连接。

例如,一个常见的错误是试图在一个语句中获取一个句柄并锁定它

// error[E0716]: temporary value dropped while borrowed
let out = std::io::stdout().lock();
//        ^^^^^^^^^^^^^^^^^       - temporary value is freed at the end of this statement
//        |
//        creates a temporary which is freed while still in use

现在锁保护器是 'static,而不是从临时变量借用,所以这可以工作了!

稳定的 API

以下方法和 trait 实现现在已稳定

以下之前稳定的函数现在是 const

其他更改

Rust 1.61.0 版本还有其他更改。查看 RustCargoClippy 中的更改。

在未来的版本中,我们计划将 Linux 内核的基线要求提高到 3.2 版本,并将 glibc 的基线要求提高到 2.17 版本。我们很乐意在 rust#95026 中收到您的反馈。

1.61.0 的贡献者

许多人共同努力创建了 Rust 1.61.0。没有你们所有人,我们不可能做到这一点。谢谢!