Rust 1.40.0 发布
Rust 1.40.0 已经正式发布。该版本的亮点包括有 #[non_exhaustive] 和 macros!() and #[attribute]s 的改进。
具体更新内容如下:
#[non_exhaustive] 结构,枚举和变体
当属性#[non_exhaustive]附加到struct或的变体时enum,它将防止定义它的板条箱外部的代码构造所述struct或变体。为了避免将来损坏,还防止其他包装箱在田地上进行彻底匹配。以下示例说明了beta取决于的错误alpha:
// alpha/lib.rs:
#[non_exhaustive]
struct Foo {
pub a: bool,
}
enum Bar {
#[non_exhaustive]
Variant { b: u8 }
}
fn make_foo() -> Foo { ... }
fn make_bar() -> Bar { ... }
// beta/lib.rs:
let x = Foo { a: true }; //~ ERROR
let Foo { a } = make_foo(); //~ ERROR
// `beta` will still compile when more fields are added.
let Foo { a, .. } = make_foo(); //~ OK
let x = Bar::Variant { b: 42 }; //~ ERROR
let Bar::Variant { b } = make_bar(); //~ ERROR
let Bar::Variant { b, .. } = make_bar(); //~ OK
// -- `beta` will still compile...
幕后发生的事情是,#[non_exhaustive] struct或的构造函数的可见性enum降低到pub(crate),从而阻止了在定义它的板条箱外部进行访问。
更重要的方面是,#[non_exhaustive]也可以附加到enum自身上。从标准库中获取的示例是Ordering:
#[non_exhaustive]
pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst }
#[non_exhaustive]在此上下文中的目的是确保可以随时间添加更多变体。这是通过防止其他包装箱从详尽模式实现match-ing上Ordering。也就是说,编译器将拒绝:
match ordering {
// This is an error, since if a new variant is added,
// this would suddenly break on an upgrade of the compiler.
Relaxed | Release | Acquire | AcqRel | SeqCst => {
/* logic */
}
}
取而代之的是,其他板条箱需要通过添加通配符来解决更多变体的可能性,例如_:
match ordering {
Relaxed | Release | Acquire | AcqRel | SeqCst => { /* ... */ }
// OK; if more variants are added, nothing will break.
_ => { /* logic */ }
}
有关该#[non_exhaustive]属性的更多详细信息,可参见稳定性报告。
Macro and attribute 的改进
例如,用户可以编写以下类型:Foo = expand_to_type!(bar); 其中 expand_to_type 将是一个 procedural macro。
包括有bang!() macros, 例如:
macro_rules! make_item { ($name:ident) => { fn $name(); } }
extern {
make_item!(alpha);
make_item!(beta);
}
Procedural macro attributes on items in extern { ... } blocks 现在也被支持:
extern "C" {
// Let's assume that this expands to `fn foo();`.
#[my_identity_macro]
fn foo();
}
目前,函数式(mac!())和属性(#[mac])macros 都可以生成macro_rules!项目。
也就是说,以下内容现在有效:
macro_rules! accept_meta { ($m:meta) => {} }
accept_meta!( my::path );
accept_meta!( my::path = "lit" );
accept_meta!( my::path ( a b c ) );
accept_meta!( my::path [ a b c ] );
accept_meta!( my::path { a b c } );
标准库中增加的 const fn
此版本中,以下函数成为const fn:
增加到标准库的函数
以下函数和宏已经稳定:
-
{f32,f64}::to_be_bytes,{f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes,{f32,f64}::from_be_bytes,{f32,f64}::from_le_bytes,和{f32,f64}::from_ne_bytes
详情可查看更新说明:
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Wine 5.0 rc2 发布,Windows 应用的兼容层
在上周的代码冻结和Wine 5.0-rc1发布之后,Wine 5.0 的第二个候选版本目前也已发布,该版本主要进行了 bug修复。 Wine(Wine Is Not an Emulator)是一个能够在多种兼容 POSIX 接口的操作系统(诸如 Linux、macOS 与BSD 等)上运行 Windows 应用的兼容层。它不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是将Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其它一些行为的内存占用,让你能够干净地整合Windows 应用到你的桌面。 Wine 5.0 rc2在过去的一周中已完成了 36 个bug 修复,但由于代码冻结,并没有添加任何新功能。目前,该团队的开发人员预计将于明年 1 月份的下半月发布稳定版的 Wine 5.0。 修复的 36 个bug内容包括有: Age of Wonders 2 演示中的 Direct3D 模式异常缓慢且出现故障 《模拟人生3》:Textures 变成黑色,有时出现异常图案。 StarFisher:输入新事件时崩溃 Pegasus Mail 4.6x崩溃 ...
-
下一篇
TigerVNC 1.10.1 发布,安全修复版本
TigerVNC1.10.1 发布了。TigerVNC 是一个高级的 VNC 远程访问的实现,基于第四代 VNC,包含一个 JPEG 压缩加速器,支持 X.Org 和 X server。 这是一个安全版本,用于修复卡巴斯基实验室发现的许多问题,这些问题影响客户端和服务器,并且理论上可以允许恶意软件控制另一端的软件。 目前尚无可利用的利用程序,并且问题要求对等方首先进行身份验证,不过官方还是敦促用户在可能的情况下升级。 详情查看更新说明: https://github.com/TigerVNC/tigervnc/releases/tag/v1.10.1
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Crontab安装和使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- MySQL数据库中FOR UPDATE的使用
- CentOS6,CentOS7官方镜像安装Oracle11G

微信收款码
支付宝收款码