Rust 发布 1.56.0 版本,支持闭包非联接捕获

栏目: 软件资讯 · 发布时间: 3年前

内容简介:Rust 1.56.0 版本已正式发布,此版本支持闭包对标识符的非联接捕获,并对 pattern做了大量优化。 且如果你此前已通过 rustup 安装了以前的 Rust 版本,运行以下命令即可升级至最新版本: $ rustup update stable...

 Rust 1.56.0 版本已正式发布,此版本支持闭包对标识符的非联接捕获,并对 pattern做了大量优化。

且如果你此前已通过 rustup 安装了以前的 Rust 版本,运行以下命令即可升级至最新版本:

$ rustup update stable                                                                                  

1.56.0 版本主要更新内容:

  • 非联接捕获:闭包现在捕获单个命名字段,不会总是捕获整个标识符。(如:|| a.x + 1现在只捕获a.x而不是a
  • 数组 IntoIteratorarray.into_iter() 现在按值,而不是按引用来迭代项目
  • patterns 的 $_:pat 标识符在 macro_rules 宏里可以匹配 |  (1.53 引入的 | 扩展 ),$_:pat_param  代替之前的 $_:pat $_:pat_param 不匹配 |  ,但是可以在所有版本中使用。
  • 默认用第二版 Cargo 。
  • Prelude 库新增 :TryIntoTryFromFromIterator 默认可用。
  • Panic 宏只接受格式化字符串,比如 println!()
  • ident#ident"..."ident'...' 变成保留语法。
  • bare_trait_objectsellipsis_inclusive_range_patterns 从警告变成报错。

闭包的非联接捕获

新的不相交捕获功能可以简化编写闭包的过程,看个例子:

// 2015 或 2018 版代码
let a = SomeStruct::new();

// 从结构体的一个字段中移出drop(a.x);

// 还是使用结构体的另一个字段
println!("{}", a.y);

// 错误:在2021版之前,会试图捕获所有' a '
let c = || println!("{}", a.y);
c();

2021版本之前,你要在形成闭包之前手动提取相关的标识符,比如 let y = &a.y; ,从 Rust 2021 开始,闭包将自动捕获它们使用的字段,因此上面的示例可以正常编译。

Cargo rust-version

Cargo.toml  现在 支持 [package] rust-version 字段来指定 crate 支持的最低 Rust 版本,如果不满足,Cargo 将退出并显示早期错误。这不会影响依赖解析器,旨在解决兼容性的问题,避免编译的时候出现模糊不清的报错。

新绑定 binding @ pattern

Rust pattern 匹配可以用绑定值的单个标识符来编写,然后 @ 一个结构更精细的 pattern ,但现在还不允许进行额外的绑定。

struct Matrix {
    data: Vec<f64>,
    row_len: usize,
}
// 在此之前,我们需要单独的语句来绑定
let matrix = get_matrix();
let row_len = matrix.row_len;
// 或者使用一个破坏性的 pattern :
let Matrix { row_len, .. } = matrix;
// Rust 1.56 现在可以同时绑定两个
let matrix @ Matrix { row_len, .. } = get_matrix();

这个功能在 Rust 1.0 之前是可以用的,不过当时因为不完善而被删除了。随着版本的稳定,现在又可以使用了。

稳定的 API

以下方法和特征已稳定:

  • std::os::unix::fs::chroot
  • UnsafeCell::raw_get
  • BufWriter::into_parts
  • core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe} (以前只在 std 里支持)
  • Vec::shrink_to
  • String::shrink_to
  • OsString::shrink_to
  • PathBuf::shrink_to
  • BinaryHeap::shrink_to
  • VecDeque::shrink_to
  • HashMap::shrink_to
  • HashSet::shrink_to

下面这些之前稳定的函数现在属于 const.

  • std::mem::transmute
  • [T]::first
  • [T]::split_first
  • [T]::last
  • [T]::split_last

其他变化

Rust 1.56.0 版本中还有一些其他修改,详情请查看 RustCargoClippy  。


以上所述就是小编给大家介绍的《Rust 发布 1.56.0 版本,支持闭包非联接捕获》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言入门经典

C语言入门经典

霍顿 (Ivor Horton) / 清华大学出版社 / 2008-4-1 / 69.80元

本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一。本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书中除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程实例。本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。读者基本不需要具备任何编程知识,即可......一起来看看 《C语言入门经典》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具