将指向元组的引用的解压迭代器拆分成两个引用集合

3
我有一个针对切片 &[(T, U)]Iterator<Item = &(T, U)>。我希望能将该迭代器解压缩成其组件 (即获得 (Vec<&T>, Vec<&U>))。
Rust 通过在 Interator 上提供的 .unzip() 方法来提供解压功能。
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标准库提供的相当简单的操作。我猜要么这个函数已经存在并且我找不到它,要么我的方法不对。
有更好的方法吗?
1个回答

5

有更好的方法吗?

“更好”略带主观性。您可以使您的功能更短:

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

使用闭包也可以实现同样的功能:

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

您可以使用闭包来完成相同的操作:

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

根据任务的不同,只克隆数据可能已经足够了。特别是在这种情况下,因为对的引用占用的空间是本身的4到8倍。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接