【问题标题】:Unzip iterator of references to tuples into two collections of references将元组引用的迭代器解压缩到两个引用集合中
【发布时间】:2018-08-12 01:59:27
【问题描述】:

我在切片 &[(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 标准库提供的相当简单的操作。我猜它要么是但我找不到它,要么我没有以正确的方式接近这个。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: reference iterator rust tuples ownership


    【解决方案1】:

    有没有更好的方法来做到这一点?

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

    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()
    

    根据任务,克隆数据就足够了。尤其是在这种情况下,因为引用 u8 占用的空间是 u8 本身的 4 或 8 倍。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多