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

问题描述 投票:2回答:1

我在切片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标准库提供。我猜它也是,我找不到它,或者我没有以正确的方式接近它。

有一个更好的方法吗?

reference iterator rust tuples ownership
1个回答
3
投票

有一个更好的方法吗?

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

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()
© www.soinside.com 2019 - 2024. All rights reserved.