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

时间:2015-06-16 11:17:52

标签: 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);

}

我收到错误

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

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

2 个答案:

答案 0 :(得分:6)

查看the definition of push_all

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

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

     

迭代切片other克隆每个元素,然后将其附加到此Vecother向量按顺序遍历。

(强调我的。)

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

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

当然,对于这个微不足道的情况,如果它纯粹是mut ness的差异,只需在初始模式中添加mut(如果它是一个函数参数,这也可以,冒号前面的位)在每个参数中都是一个模式,与let类似,因此fn foo(mut x: Vec<T>) { … }工作正常,相当于fn foo(x: Vec<T>) { let mut x = x; … }。)

答案 1 :(得分:4)

因为,如果你转到documentation for Vec::push_all并向上滚动一下,你会看到这一行:

impl<T: Clone> Vec<T>

这意味着当Vec<T>实现T时,以下方法仅针对Clone实施。在这种情况下,TUserUser 未实现Clone 。因此,该方法不存在。

您可以在#[derive(Clone)]之前添加struct User {...}来解决此问题。