Rust中如何通过元组首个元素查找Vector内的目标元组?
Rust哈希映射中查找元组元素的错误解决
问题场景
定义了两个哈希映射:
let mut adj_list: HashMap<String, Vec<String>>; let mut adj_matrix: HashMap<String, Vec<(String, bool)>> = HashMap::new();
编写循环逻辑时出现错误:
for (src, _neighbors) in self.adj_list.iter() { for (dest, _n) in self.adj_list.iter(){ let d: &mut (String, bool) = adj_matrix.get_mut(src) .into_iter() .find(|&x| x == dest) // 此处报错 .unwrap(); // 对元组d执行操作 } }
遇到的错误
第一次报错:
adj_matrix.get_mut(src).into_iter().find(|&x| x == dest); ^^ no implementation for `Vec<(String, bool)> == String`
尝试修改为x.1 == dest后,第二次报错:
adj_matrix.get_mut(src).into_iter().find(|&x| x.1 == dest); ^ unknown field
问题根源
adj_matrix.get_mut(src)返回的是Option<&mut Vec<(String, bool)>>,调用into_iter()后,迭代的是整个Vec容器,而非容器内的元组元素。此时find闭包中的x是&mut Vec<(String, bool)>类型,和dest(&String)类型不匹配,无法直接比较。- 第二次修改时,
x依然是Vec类型,不是元组,所以不存在.1字段,自然报错。
正确实现
需要先处理get_mut返回的Option,再迭代Vec内部的元组元素,同时在find闭包中对比元组的第一个元素(目标字符串)和dest。
基础修正版本(假设键一定存在)
for (src, _neighbors) in self.adj_list.iter() { for (dest, _n) in self.adj_list.iter() { let d: &mut (String, bool) = adj_matrix.get_mut(src) .unwrap() // 假设src必然在adj_matrix中,否则会panic .iter_mut() // 迭代Vec中的可变元组引用 .find(|(s, _)| s == dest) // 对比元组第一个元素与dest .unwrap(); // 假设dest对应的元组必然存在,否则会panic // 对元组d执行操作 } }
安全版本(处理不存在的情况)
如果无法保证键或元素一定存在,建议用if let替代unwrap(),避免程序panic:
for (src, _neighbors) in self.adj_list.iter() { for (dest, _n) in self.adj_list.iter() { // 先检查src是否存在于adj_matrix中 if let Some(tuple_vec) = adj_matrix.get_mut(src) { // 再查找对应dest的元组 if let Some(target_tuple) = tuple_vec.iter_mut().find(|(s, _)| s == dest) { // 对target_tuple执行操作 } } } }
内容的提问来源于stack exchange,提问作者Hoswoo
相关产品推荐
相关产品推荐

