Rust 1.37.0 的亮点包括通过类型别名引用枚举变量、内置 cargo vendor、对宏使用未命名的 const、配置文件引导的优化、Cargo 中的 default-run 和枚举上的 #[repr(align(N))] 。
通过类型别名引用枚举变量
在 Rust 1.37.0,可以通过类型别名引用枚举变量。例如:
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 : Variable 引用枚举变量:
impl Coin {
fn value_in_cents(&self) -> u8 {
match self {
Self::Penny => 1,
Self::Nickel => 5,
Self::Dime => 10,
Self::Quarter => 25,
}
}
}
更确切地说,Rust 现在允许通过“type-relative resolution”来引用枚举变量,<MyType<..>>::Variant。
内置 cargo 支持独立依赖关系
cargo vendor 命令集成到 Cargo,该命令获取项目的所有依赖项,将它们解压缩到 vendor/ 目录中,并展示了在构建过程中使用分布式代码所需的配置片段。
cargo vendor 已经在生产中使用过很多种情况:Rust 编译器 rustc 使用它在发行版 tarball 中传递它的所有依赖项,而具有 Monorepos 的项目使用它在源代码管理中提交依赖项的代码。
对宏使用未命名的 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,可以更容易地为静态分析目的创建人机工程学和可重用的声明性和过程宏。
配置文件引导的优化(Profile-Guided Optimization)
rustc 编译器现在通过 -C profile-generate 和 -C profile-use 标志提供了对配置文件引导优化(PGO)的支持。
Profile-Guided Optimization 允许编译器根据来自实际工作负载的反馈优化代码。它的工作方式是编译程序,在两个步骤中进行优化:
在 Cargo 项目中选择默认二进制文件
cargo run 对于快速测试 CLI 应用程序是可以的,当多个二进制文件出现在同一个包中时,必须使用 --bin 标志显式声明要运行的二进制文件的名称。这使得 cargo run 不像我们想要的那样符合人机工程学,特别是当一个二进制文件比其他的更频繁地被调用时。
Rust 1.37.0 通过添加 default-run 来解决这个问题,这是 Cargo.toml 中的一个新键,当这个键在 [Package] 部分中声明时,如果没有传递 --bin 标志,cargo run 将默认为所选的二进制文件。
枚举上的 #[repr(align(N))]
#[repr(align(N))] 属性可用于提高类型定义的对齐性。以前,该属性仅允许在 struct 和 union 中使用。在 Rust 1.37.0,该属性现在也可以用于枚举定义。例如,如下类型 Align16 将如预期的那样,报告 16 为对齐,而不使用 #[repr(align(16))] 的对齐将为 4:
#[repr(align(16))]
enum Align16 {
Foo { foo: u32 },
Bar { bar: u32 },
}
在枚举上使用 #[repr(align(N))] 的语义与使用该对齐定义包装器结构体 AlignN<T> 一样 ,然后使用 AlignN<MyEnum>:
#[repr(align(N))]
struct AlignN<T>(T);
在 Rust 1.37.0 中,有一些标准库稳定化:
获取 Rust 1.37.0 方式如下:
$ rustup update stable
或者访问官网获取:
https://www.rust-lang.org/install.html
详情见发布说明
(文/开源中国)