Rust中Vec转按level分组的HashMap时类型不匹配问题求助
问题解决:Rust中Vec转HashMap<String, Vec>类型不匹配
错误原因
users.iter()返回的是对Vec中元素的不可变引用(&User),但你定义的HashMap<String, Vec<User>>的值类型是Vec<User>,需要的是拥有所有权的User实例,而非引用,因此出现类型不匹配错误。
解决方案
根据你的需求选择以下任意一种方案:
方案1:消耗原Vec,转移元素所有权(推荐不需要保留原Vec时使用)
将iter()替换为into_iter(),这样会遍历原Vec并转移每个元素的所有权,循环中拿到的是User而非&User:
let users: Vec<User> = serde_json::from_str(&data).unwrap(); let mut users_by_level: HashMap<String, Vec<User>> = HashMap::new(); for user in users.into_iter() { users_by_level .entry(user.level.clone()) .or_insert(Vec::new()) .push(user); }
方案2:保留原Vec,克隆User实例(需要保留原Vec时使用)
先给User结构体派生Clone trait,然后在循环中克隆每个User实例:
#[derive(Debug, Serialize, Deserialize, Clone)] pub struct User { pub id: String, pub email: String, pub first_name: String, pub last_name: String, pub level: String, } let users: Vec<User> = serde_json::from_str(&data).unwrap(); let mut users_by_level: HashMap<String, Vec<User>> = HashMap::new(); for user in users.iter() { users_by_level .entry(user.level.clone()) .or_insert(Vec::new()) .push(user.clone()); }
方案3:存储引用而非所有权(避免克隆,适合临时场景)
修改HashMap的类型为存储引用,这样无需转移所有权或克隆,但需要注意生命周期(原users Vec必须在HashMap失效前保持存在):
let users: Vec<User> = serde_json::from_str(&data).unwrap(); let mut users_by_level: HashMap<&str, Vec<&User>> = HashMap::new(); for user in users.iter() { users_by_level .entry(&user.level) .or_insert(Vec::new()) .push(user); }
内容的提问来源于stack exchange,提问作者xqcccccccccc
相关产品推荐
相关产品推荐

