前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust 1.37.0 稳定版发布

Rust 1.37.0 稳定版发布

作者头像
Debian中国
发布2020-01-21 16:45:35
7670
发布2020-01-21 16:45:35
举报
文章被收录于专栏:Debian中国Debian中国

Rust 1.37.0 stable 有什么?Rust 1.37.0 的亮点包括通过类型别名引用枚举变量、内置 cargo vendor、对宏使用未命名的 const、配置文件引导的优化、Cargo 中的 default-run 和枚举上的 #[repr(align(N))] 。

通过类型别名引用枚举变量

在 Rust 1.37.0,可以通过类型别名引用枚举变量。例如:

代码语言:javascript
复制
type ByteOption = Option;

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

要实现它,Self 充当类型别名。在 Rust 1.37.0 中,还可以使用 Self : Variable 引用枚举变量:

代码语言:javascript
复制
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 编译器中:

代码语言:javascript
复制
/// 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>, 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 允许编译器根据来自实际工作负载的反馈优化代码。它的工作方式是编译程序,在两个步骤中进行优化:

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

在 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:

代码语言:javascript
复制
#[repr(align(16))]
enum Align16 {
    Foo { foo: u32 },
    Bar { bar: u32 },
}

在枚举上使用 #[repr(align(N))] 的语义与使用该对齐定义包装器结构体 AlignN<T> 一样 ,然后使用 AlignN<MyEnum>:

代码语言:javascript
复制
#[repr(align(N))]
struct AlignN<T>(T);

在 Rust 1.37.0 中,有一些标准库稳定化:

获取 Rust 1.37.0 方式如下:

代码语言:javascript
复制
$ rustup update stable

或者访问官网获取:https://www.rust-lang.org/install.html. .详情见发布说明

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档