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

Cha*_*er5 3 iterator tuples reference ownership rust

我有Iterator<Item = &(T, U)>一片&[(T, U)]。我想将此迭代器解压缩到其组件中(即获取(Vec<&T>, Vec<&U>))。

Rust 通过以下.unzip()方法提供解压缩功能Interator

points.iter().unzip()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不能按原样工作,因为.unzip()期望迭代器项的类型是元组;我的是对元组的引用。

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

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

然后我可以map通过结果迭代器来获得.unzip()可以处理的东西:

points.iter().map(distribute_ref).unzip()
Run Code Online (Sandbox Code Playgroud)

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

有一个更好的方法吗?

red*_*ime 5

有一个更好的方法吗?

“更好”有点主观。你可以让你的函数更短:

fn distribute_ref<T, U>(x: &(T, U)) -> (&T, &U) {
    (&x.0, &x.1)
}
Run Code Online (Sandbox Code Playgroud)

终身省音允许在这种情况下省略一生的注解。

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

points.iter().map(|&(ref a, ref b)| (a, b)).unzip()
Run Code Online (Sandbox Code Playgroud)

根据任务,克隆数据就足够了。特别是在这种情况下,作为引用u8需要比u8它本身多 4 或 8 倍的空间。

points().iter().cloned().unzip()
Run Code Online (Sandbox Code Playgroud)