宣布 Rust 1.39.0

2019 年 11 月 7 日 · Rust 发布团队

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

如果您之前通过 rustup 安装了 Rust,获取 Rust 1.39.0 就像

$ rustup update stable

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

1.39.0 稳定版中的内容

Rust 1.39.0 的亮点包括 async/.awaitmatch 保护中对按移动绑定进行的共享引用以及函数参数上的属性。此外,请参阅详细的发布说明以获取更多信息。

.await 结束了,async fn 来了

之前在 Rust 1.36.0 中,我们宣布Future 特性。当时,我们注意到

通过这种稳定性,我们希望为重要的箱子、库和生态系统提供时间来为 async / .await 做准备,我们将在未来告诉您更多关于它们的信息。

承诺就是承诺。因此,在 Rust 1.39.0 中,我们很高兴地宣布 async / .await 已稳定!具体来说,这意味着您可以定义 async 函数和块并 .await 它们。

async 函数(您可以通过编写 async fn 而不是 fn 来引入)除了在调用时返回 Future 之外什么也不做。此 Future 是一个挂起的计算,您可以通过 .await 它来驱动它完成。除了 async fn 之外,async { ... }async move { ... } 块(充当闭包)可用于定义“异步字面量”。

有关 async / .await 发布的更多信息,请阅读Niko Matsakis 的博客文章

match 保护中对按移动绑定进行的引用

在 Rust 中进行模式匹配时,变量(也称为“绑定”)可以通过以下方式绑定

  • 按引用,无论是不可变的还是可变的。这可以通过显式方式实现,例如分别通过 ref my_varref mut my_var。不过,大多数情况下,绑定模式会自动推断。

  • 按值 - 无论是按复制(当绑定变量的类型实现 Copy 时),还是按其他方式按移动

以前,Rust 会禁止在 match 表达式的 if 保护中对按移动绑定进行共享引用。这意味着以下代码将被拒绝

fn main() {
    let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);

    match array {
        nums
//      ---- `nums` is bound by move.
            if nums.iter().sum::<u8>() == 10
//                 ^------ `.iter()` implicitly takes a reference to `nums`.
        => {
            drop(nums);
//          ----------- `nums` was bound by move and so we have ownership.
        }
        _ => unreachable!(),
    }
}

使用 Rust 1.39.0,上面的代码片段现在被编译器接受了。我们希望这将为 match 表达式提供更流畅、更一致的体验。

函数参数上的属性

使用 Rust 1.39.0,现在允许在函数、闭包和函数指针的参数上使用属性。以前,您可能写过

#[cfg(windows)]
fn len(slice: &[u16]) -> usize {
    slice.len()
}
#[cfg(not(windows))] 
fn len(slice: &[u8]) -> usize {
    slice.len()
}

...现在您可以更简洁地写成

fn len(
    #[cfg(windows)] slice: &[u16], // This parameter is used on Windows.
    #[cfg(not(windows))] slice: &[u8], // Elsewhere, this one is used.
) -> usize {
    slice.len()
}

您可以在此位置使用的属性包括

  1. 条件编译:cfgcfg_attr

  2. 控制 lint:allowwarndenyforbid

  3. 由应用于项目的程序化宏属性使用的辅助属性。

    我们希望这将用于在整个生态系统中提供更易读、更符合人体工程学的基于宏的 DSL。

借用检查迁移警告在 Rust 2018 中是硬错误

在 1.36.0 版本中,我们宣布,NLL 在 Rust 2018 首次发布后已进入 Rust 20151.31

如 1.36.0 版本中所述,旧的借用检查器存在一些错误,这些错误会导致内存不安全。这些错误由 NLL 借用检查器修复。由于这些修复破坏了一些稳定代码,我们决定通过检查旧的借用检查器是否接受程序以及 NLL 检查器是否拒绝程序来逐步引入错误。如果是,则错误将变为警告。

使用 Rust 1.39.0,这些警告现在在 Rust 2018 中是错误。在下一个版本 Rust 1.40.0 中,这也将适用于 Rust 2015,这将最终使我们能够删除旧的借用检查器,并保持编译器干净。

如果您受到影响,或者想了解更多信息,请阅读Niko Matsakis 的博客文章

标准库中更多 const fn

使用 Rust 1.39.0,以下函数已成为 const fn

标准库的添加

在 Rust 1.39.0 中,以下函数已稳定

其他更改

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

另请参阅兼容性说明,以检查您是否受到这些更改的影响。

1.39.0 的贡献者

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