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 标准库提供的一个相当简单的操作。我猜它要么是,我找不到它,要么我没有以正确的方式接近这个。
有一个更好的方法吗?
有一个更好的方法吗?
“更好”有点主观。你可以让你的函数更短:
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)
| 归档时间: |
|
| 查看次数: |
1019 次 |
| 最近记录: |