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