微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将结构向量转换为另一结构向量的惯用方式是什么

如何解决将结构向量转换为另一结构向量的惯用方式是什么

我的函数Vec的结构体作为参数,并将其每个元素放入另一个向量中作为新的结构域:

fn new(cards: Vec<Card<'t>>) -> Self {
        CardsConnection {
            edges: cards.iter().map(|c| CardsConnectionEdge {
                cursor: c.id.clone(),node: *c
            }).collect::<Vec<CardsConnectionEdge>>()
        }
    }

我真的很想搬家,所以只有新的vector应该拥有Card实例。因此,由于map得到了引用,因此我想取消引用以移动值,但是出现以下错误

error[E0507]: cannot move out of `*c` which is behind a shared reference
  --> src/model.rs:74:23
   |
74 |                 node: *c
   |                       ^^ move occurs because `*c` has type `model::Card<'_>`,which does not implement the `copy` trait

error: aborting due to prevIoUs error; 8 warnings emitted

虽然此非“功能样式”代码可以正常工作:

fn new(cards: Vec<Card<'t>>) -> Self {
        let mut edges = Vec::<CardsConnectionEdge>::with_capacity(cards.len());

        for c in cards {
            edges.push(CardsConnectionEdge {
                cursor: c.id.clone()
                node: c
            })
        }

        CardsConnection {
            edges
        }
    }

但看起来有点笨拙。

是否有一种方法可以使用迭代器或某种map函数来完成相同的工作?还是解决此类问题的惯用方式是什么?

解决方法

您正在寻找other_condition into_iter()函数通过引用对项目进行迭代,而iter函数对项目进行迭代,将其移至新的作用域。

因此into_iterfor c in cards {...}基本相同。两者都将卡的元素移到cards.into_iter().for_each(|c| ... )范围内。

...

Reference: iter vs. into_iter

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。