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 版本,支持闭包非联接捕获》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

第一行代码:Android(第2版)

第一行代码:Android(第2版)

郭霖 / 人民邮电出版社 / 2016-12-1 / CNY 79.00

本书被广大Android 开发者誉为“Android 学习第一书”。全书系统全面、循序渐进地介绍了Android软件开发的必备知识、经验和技巧。 第2版基于Android 7.0 对第1 版进行了全面更新,将所有知识点都在最新的Android 系统上进行重新适配,使用 全新的Android Studio 开发工具代替之前的Eclipse,并添加了对Material Design、运行时权限、......一起来看看 《第一行代码:Android(第2版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换