Hi, I tried to append Vec by extend() but failed, any suggestion? Thanks!
struct Node {}
fn extend_nodes(other_nodes: &[Node]) {
let mut nodes:Vec<Node> = Vec::new();
nodes.extend(other_nodes);
}
fn main() {
let node2:Vec<Node> = Vec::new();
extend_nodes(node2);
}
error[E0271]: type mismatch resolving `<std::slice::Iter<'_, Node> as IntoIterator>::Item == Node`
--> src\main.rs:5:11
|
5 | nodes.extend(other_nodes.iter());
| ^^^^^^ expected reference, found struct `Node`
|
= note: expected reference `&Node`
found struct `Node`
other_nodes will produce &Node from its iterator, but extend needs owned Nodes instead. Here's a few variants that can work:
#[derive(Clone)]
struct Node;
fn extend_nodes_1(other_nodes: &[Node]) {
let mut nodes:Vec<Node> = Vec::new();
nodes.extend(other_nodes.into_iter().cloned());
}
fn extend_nodes_2(other_nodes: &[Node]) {
let mut nodes:Vec<Node> = Vec::new();
nodes.extend_from_slice(other_nodes);
}
fn extend_nodes_3(other_nodes: Vec<Node>) {
let mut nodes:Vec<Node> = Vec::new();
nodes.extend(other_nodes);
}
fn main() {
let node2:Vec<Node> = Vec::new();
extend_nodes_1(&node2);
extend_nodes_2(&node2);
extend_nodes_3(node2);
}
Note that Vec implements Extend<&T> if T: Clone T: Copy. So adding #[derive(Clone, Copy)] on Node will solve the issue
It actually wants T: Copy -- see here.