Rust 1.37.0 稳定版发布
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
详情见发布说明
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Ant Design Mobile 2.3.0 发布,AntD 移动端设计规范
Ant Design Mobile 2.3.0 发布了。Ant Design Mobile 即 Ant Design 移动端设计规范,antd-mobile是 Ant Design 的移动规范的 React 实现,服务于蚂蚁及口碑无线业务。 更新内容如下: Feature Toast增加全局方法Toast.config、Toast.hide#3304 Input-Item金额键盘 新增disabledKeys属性#3330 Enhancement notice-bar修复 typescript 错误 Bug Fix DatePicker修复 时间日期选择器特殊情况下的死循环问题#125、#191 ImagePicker修复特殊图片不显示的 bug#3311 修复部分 demo 在 ios9 下的白屏问题#3292 Modal.prompt修复微信中无法聚焦的问题#3346 Tabs支持子元素传入null#3270 更新说明及下载地址
- 下一篇
Go 1.12.9 发布,小版本更新
Go 昨天发布了一个小版本更新 1.12.9,此版本的更新内容主要包括对链接器、os 以及 math/big 包的修复。具体如下: cmd/link: stack depth check too shallow [1.12 backport] os.RemoveAll: openFdAt function without O_CLOEXEC and cause fd escape to child process [1.12 backport] cmd/link: missing section for relocation target [1.12 backport] math/big: arm64 assembly code for shlVU is incorrect [1.12 backport] doc: syscall: document Setrlimit behavior change on Go 1.12 on macOS 查看发布说明以了解更多信息:https://golang.org/doc/devel/release.html#go1.12.minor 可以从 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Mario游戏-低调大师作品
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,CentOS7官方镜像安装Oracle11G