Rust 1.61.0版本的新功能介绍

178 阅读4分钟

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

如果你已经通过rustup安装了以前的Rust版本,你可以用1.61.0获得:

rustup update stable

如果你还没有,你可以从我们网站的相应页面获得rustup,并在GitHub上查看1.61.0的详细发布说明

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

1.61.0稳定版中的内容

自定义退出代码从main

一开始,Rustmain 函数只能返回单位类型() (隐式或显式),总是在退出状态中表示成功,如果你想要其他的,就必须调用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 指针。

  • 特质界线T: Copy现在你可以在通用参数上写入特质边界,如const fn ,而以前只允许Sized

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

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

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

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

锁定stdio的静态句柄

三个标准的I/O流 --Stdin,Stdout, 和Stderr -- 都有一个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,没有你们,我们不可能做到这一点,谢谢你们!"。