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)。
配置文件引导优化 允许编译器根据实际工作负载的反馈来优化代码。它通过编译程序以两个步骤进行优化来实现
- 首先,程序在编译器插入的检测代码下进行构建。这是通过将
-C profile-generate
标志传递给rustc
来完成的。然后,需要在样本数据上运行检测后的程序,并将分析数据写入文件。 - 然后,程序再次构建,这次将收集的分析数据通过
-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))]
属性 可用于提高类型定义的 对齐方式。以前,该属性仅允许在 struct
和 union
上使用。使用 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 中,标准库已稳定了许多内容
BufReader::buffer
和BufWriter::buffer
Cell::from_mut
Cell::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
{i,u}{8,16,32,64,128,size}::reverse_bits
和Wrapping::reverse_bits
slice::copy_within
其他更改
Rust 1.37 版本中还有其他更改:查看 Rust、Cargo 和 Clippy 中的更改。
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 仓库。