所以在这个简单的例子中
#![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>
?在这种情况下,唯一的方法是逐个迭代和添加元素吗?
答案 0 :(得分:6)
impl<T> Vec<T> where T: Clone {
fn push_all(&mut self, other: &[T]);
}
将切片中的所有元素追加到
Vec
。迭代切片
other
,克隆每个元素,然后将其附加到此Vec
。other
向量按顺序遍历。
(强调我的。)
您的类型必须实现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
实施。在这种情况下,T
为User
,User
未实现Clone
。因此,该方法不存在。
您可以在#[derive(Clone)]
之前添加struct User {...}
来解决此问题。