宣布 Rust 1.37.0

2019 年 8 月 15 日 · Rust 发布团队

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

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

$ rustup update stable

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

1.37.0 稳定版中的新内容

Rust 1.37.0 的亮点包括通过 type 别名引用 enum 变体、内置 cargo vendor、未命名的 const 项、配置文件引导优化、Cargo 中的 default-run 键以及 enum 上的 #[repr(align(N))]。继续阅读以了解一些亮点,或查看 详细的发布说明以获取更多信息。

通过 type 别名引用 enum 变体

使用 Rust 1.37.0,您现在可以通过类型别名引用 enum 变体。例如

type ByteOption = Option<u8>;

fn increment_or_zero(x: ByteOption) -> u8 {
    match x {
        ByteOption::Some(y) => y + 1,
        ByteOption::None => 0,
    }
}

在实现中,Self 充当类型别名。因此,在 Rust 1.37.0 中,您也可以使用 Self::Variant 引用 enum 变体

impl Coin {
    fn value_in_cents(&self) -> u8 {
        match self {
            Self::Penny => 1,
            Self::Nickel => 5,
            Self::Dime => 10,
            Self::Quarter => 25,
        }
    }
}

更准确地说,Rust 现在允许您通过“类型相关解析” <MyType<..>>::Variant 引用 enum 变体。更多详细信息可在 稳定性报告 中找到。

内置 Cargo 对供应商依赖的支持

作为单独的 crate 可用 多年后,cargo vendor 命令现在已直接集成到 Cargo 中。该命令获取您项目的所有依赖项,并将它们解压缩到 vendor/ 目录中,并显示在构建期间使用供应商代码所需的配置片段。

在多个情况下,cargo vendor 已经在生产中使用:Rust 编译器 rustc 使用它在发布 tarball 中打包所有其依赖项,而具有单仓库的项目使用它在源代码管理中提交依赖项的代码。

将未命名的 const 项用于宏

您现在可以创建 未命名的 const。与其为常量指定显式名称,不如简单地将其命名为 _。例如,在 rustc 编译器中,我们发现

/// Type size assertion where the first parameter
/// is a type and the second is the expected size.
#[macro_export]
macro_rules! static_assert_size {
    ($ty:ty, $size:expr) => {
        const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()];
        //    ^ Note the underscore here.
    }
}

static_assert_size!(Option<Box<String>>, 8); // 1.
static_assert_size!(usize, 8); // 2.

请注意第二个 static_assert_size!(..):由于使用了未命名的常量,您可以定义新的项而不会出现命名冲突。以前,您需要编写 static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8);。相反,使用 Rust 1.37.0,现在更容易为静态分析目的创建符合人体工程学且可重用的声明式和过程式宏。

配置文件引导优化

rustc 编译器现在通过 -C profile-generate-C profile-use 标志 支持配置文件引导优化 (PGO)

配置文件引导优化 允许编译器根据实际工作负载的反馈来优化代码。它通过编译程序以两个步骤进行优化来实现

  1. 首先,程序在编译器插入的检测代码下进行构建。这是通过将 -C profile-generate 标志传递给 rustc 来完成的。然后,需要在样本数据上运行检测后的程序,并将分析数据写入文件。
  2. 然后,程序再次构建,这次将收集的分析数据通过 -C profile-use 标志反馈到 rustc 中。此构建将利用收集的数据,使编译器能够更好地决定代码放置、内联和其他优化。

有关配置文件引导优化的更深入信息,请参阅 rustc 手册中相应的 章节

在 Cargo 项目中选择默认二进制文件

cargo run 非常适合快速测试 CLI 应用程序。当同一个包中存在多个二进制文件时,您必须使用 --bin 标志显式声明要运行的二进制文件的名称。这使得 cargo run 不如我们希望的那样符合人体工程学,尤其是在一个二进制文件比其他二进制文件更常被调用时。

Rust 1.37.0 通过添加 default-run 来解决这个问题,这是一个 Cargo.toml 中的新键。当该键在 [package] 部分声明时,如果未传递 --bin 标志,cargo run 将默认使用所选二进制文件。

enum 上的 #[repr(align(N))]

#[repr(align(N))] 属性 可用于提高类型定义的 对齐方式。以前,该属性仅允许在 structunion 上使用。使用 Rust 1.37.0,该属性现在也可以 enum 定义上使用。例如,以下类型 Align16 将如预期的那样报告 16 作为对齐方式,而没有 #[repr(align(16))] 的自然对齐方式将是 4

#[repr(align(16))]
enum Align16 {
    Foo { foo: u32 },
    Bar { bar: u32 },
}

enum 上使用 #[repr(align(N)) 的语义与定义具有该对齐方式的包装结构 AlignN<T> 然后使用 AlignN<MyEnum> 相同。

#[repr(align(N))]
struct AlignN<T>(T);

库更改

在 Rust 1.37.0 中,标准库已稳定了许多内容

其他更改

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

1.37.0 的贡献者

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

Rust 基础设施的新赞助商

我们要感谢 Rust 基础设施的两家新赞助商,他们提供了使 Rust 1.37.0 成为现实所需的资源:亚马逊网络服务 (AWS) 和微软 Azure。

  • AWS 提供了发布工件(编译器、库、工具和源代码)的托管,通过 CloudFront 向用户提供这些工件,在 EC2 上使用 Crater 防止回归,以及管理在 AWS 上托管的其他与 Rust 相关的基础设施。
  • 微软 Azure 赞助了 Rust CI 基础设施的构建者,尤其是资源密集型 rust-lang/rust 仓库。