所以在这个简单的例子中
#![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>?在这种情况下,唯一的方法是逐个迭代和添加元素吗?
看看定义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; … }.)