将对元组的引用的迭代器解压缩为两个引用集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将对元组的引用的迭代器解压缩为两个引用集合相关的知识,希望对你有一定的参考价值。

我在切片Iterator<Item = &(T, U)>上有一个&[(T, U)]。我想将这个迭代器解压缩到它的组件中(即获得(Vec<&T>, Vec<&U>))。

Rust通过.unzip()上的Interator方法提供解压缩功能:

points.iter().unzip()

不幸的是,这不能正常工作,因为.unzip()期望迭代器项的类型是一个元组;我的是一个元组的参考。

为了解决这个问题,我尝试编写一个函数,该函数在对元组的引用和引用元组之间进行转换:

fn distribute_ref<'a, T, U>(x: &'a (T, U)) -> (&'a T, &'a U) {
    (&x.0, &x.1)
}

然后我可以在生成的迭代器上使用map来获取.unzip()可以处理的内容:

points.iter().map(distribute_ref).unzip()

这现在有效,但我觉得有点奇怪。特别是,distribute_ref似乎是一个相当简单的操作,将由Rust标准库提供。我猜它也是,我找不到它,或者我没有以正确的方式接近它。

有一个更好的方法吗?

答案

有一个更好的方法吗?

“更好”有点主观。你可以缩短你的功能:

fn distribute_ref<T, U>(x: &(T, U)) -> (&T, &U) {
    (&x.0, &x.1)
}

在这种情况下,Lifetime elision允许省略生命周期注释。

你可以使用一个闭包来做同样的事情:

points.iter().map(|&(ref a, ref b)| (a, b)).unzip()

根据任务,克隆数据就足够了。特别是在这种情况下,参考u8u8本身需要4或8倍的空间。

points().iter().cloned().unzip()

以上是关于将对元组的引用的迭代器解压缩为两个引用集合的主要内容,如果未能解决你的问题,请参考以下文章

元组的相对不可变性

流畅的python第八章对象引用,可变性和垃圾回收

为什么在取消引用非元组时,对取消引用的引用元组的匹配不起作用?

迭代器失效的几种情况

Python数据类型-元组

Python3之collections模块