宣布 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_SUCCESSErr 转换为 EXIT_FAILURE(还会调试打印错误)。在幕后,这些备用返回类型通过一个不稳定的 Termination 特性统一起来。

在这个版本中,Termination 特性终于稳定了,以及一个更通用的 ExitCode 类型,它包装了特定于平台的返回类型。它有 SUCCESSFAILURE 常量,还实现了 From<u8> 以获得更多任意值。Termination 特性也可以为您的自定义类型实现,允许您在转换为 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 指针。

  • 特质边界:您现在可以在 const fn 的泛型参数上编写特质边界,例如 T: Copy,而之前只允许 Sized

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

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

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

请参阅参考手册的常量求值部分,以了解有关 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

以下方法和特质实现现在已稳定

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

其他更改

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

在未来的版本中,我们计划将 Linux 内核的基线要求提高到 3.2 版,将 glibc 的基线要求提高到 2.17 版。我们非常希望您在rust#95026中提供反馈。

1.61.0 的贡献者

许多人共同创建了 Rust 1.61.0。没有你们,我们无法做到。感谢!