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



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

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

我真的想要移动,所以只有新的向量才应该拥有Card实例。因此,由于地图有一个引用,我想取消对它的引用来移动值,但我得到了以下错误:

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
}
}

但看起来有点笨拙。

有没有一种方法可以使用迭代器或某种映射函数来做同样的事情?或者解决这类问题的惯用方法是什么?

您正在寻找into_iter()iter函数通过引用迭代项,而into_iter迭代项,将它们移动到新的范围中。

所以for c in cards {...}cards.into_iter().for_each(|c| ... )本质上是一样的。两者都将卡片的元素移动到...范围内。

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

参考:iter与into_iter

相关内容

  • 没有找到相关文章

最新更新