内容简介:Rust 1.37.0 stable 有什么? Rust 1.37.0 的亮点包括通过类型别名引用枚举变量、内置 cargo vendor、对宏使用未命名的 const、配置文件引导的优化、Cargo 中的 default-run 和枚举上的 #[repr(align(N))] 。 通过...
Rust 1.37.0 stable 有什么?
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 允许编译器根据来自实际工作负载的反馈优化代码。它的工作方式是编译程序,在两个步骤中进行优化:
- 首先,程序是用编译器插入的 工具 构建的。这是通过将 -C profile-generate 标志传递给 rustc 来完成的。然后,需要在示例数据上运行检测程序,并将分析数据写入文件
- 之后,重新构建程序,这一次使用 -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:
#[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 中,有一些标准库稳定化:
- 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.0 方式如下:
$ rustup update stable
或者访问官网获取:
https://www.rust-lang.org/install.html
详情见发布说明
以上所述就是小编给大家介绍的《Rust 1.37.0 稳定版发布》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Thunderbird 78 稳定版发布
- systemd 246 稳定版发布
- Chrome 86 稳定版发布
- systemd 247 稳定版发布
- Fedora 31 稳定版发布
- PyCharm 2020.1 稳定版发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Qt 5.9 C++开发指南
王维波、栗宝鹃、侯春望 / 人民邮电出版社 / 2018-5-1 / 89.00元
本书以Qt 5.9 LTS版本为开发平台,详细介绍了Qt C++开发应用程序的技术,包括Qt应用程序的基本架构、信号与槽工作机制、图形显示的Graphics/View架构、数据编辑和显示的Model/View架构、对话框和多窗口的设计与调用方法等,介绍了常用界面组件、文件读写、绘图、图表、数据可视化、数据库、多线程、网络和多媒体等模块的使用。每个编程主题都精心设计了完整的实例程序。 通过阅读......一起来看看 《Qt 5.9 C++开发指南》 这本书的介绍吧!