找不到自定义结构的vector方法push_all

Cab*_*ero 3 rust

所以在这个简单的例子中

#![feature(collections)]

struct User {
    reference: String,
    email: String
}

fn main() {

    let rows = vec![
        vec!["abcd".to_string(), "test@test.com".to_string()],
        vec!["efgh".to_string(), "test1@test.com".to_string()],
        vec!["wfee".to_string(), "test2@test.com".to_string()],
        vec!["rrgr".to_string(), "test3@test.com".to_string()]
    ];
    let mut rows_mut: Vec<Vec<String>> = Vec::new();
    rows_mut.push_all(&rows);

    let mut users_mut: Vec<User> = Vec::new();
    let users = vec![
        User { reference: "ref1".to_string(), email: "test@test.com".to_string() },
        User { reference: "ref2".to_string(), email: "test1@test.com".to_string() }
    ];
    users_mut.push_all(&users);

}
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误

src/main.rs:24:12: 24:28 error: no method named `push_all` found for type `collections::vec::Vec<User>` in the current scope
src/main.rs:24  users_mut.push_all(&users);
                          ^~~~~~~~~~~~~~~~
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)

为什么它适用于Vec<String>,但不适用于Vec<User>?在这种情况下,唯一的方法是逐个迭代和添加元素吗?

Chr*_*gan 6

看看定义push_all:

impl<T> Vec<T> where T: Clone {
    fn push_all(&mut self, other: &[T]);
}
Run Code Online (Sandbox Code Playgroud)

将切片中的所有元素追加到Vec.

迭代切片other,克隆每个元素,然后将其附加到此Vec.该other载体在-顺序遍历.

(强调我的.)

您的类型必须实现,Clone因为它克隆了每个值.String做; User没有.你可以添加#[derive(Clone)]它.

如果您愿意使用源向量,则应该使用x.extend(y.into_iter())它来避免需要克隆值.

当然,对于这个简单的情况,如果它纯粹是mutness 的差异,只需mut在初始模式中添加(如果它是一个函数参数,这也适用,每个参数中冒号之前的位是一个模式,就像let,所以fn foo(mut x: Vec<T>) { … }工作正常并相当于fn foo(x: Vec<T>) { let mut x = x; … }.)