如何用另一个HashMap的内容扩展Rust中的HashMap?
解决HashMap扩展时的类型不匹配问题
这个错误的核心原因很清晰:你调用了iter()方法,它返回的是引用类型的迭代器(每个元素是(&String, &u64)),但HashMap::extend需要的是拥有所有权的键值对((String, u64)),两者类型不匹配,所以编译器报错了。
这里有两种简单的解决方式:
方案一:直接传入HashMap对象(推荐)
因为HashMap本身实现了IntoIterator trait,当你把它传给extend时,会自动转换成输出(String, u64)的迭代器,完全符合要求:
let mut track_nums: HashMap<String, u64> = HashMap::new(); for id in client.find_album(artist, album) { track_nums.extend(client.get_tracks(id)); }
这里不需要额外调用iter(),直接用get_tracks返回的HashMap即可,代码更简洁高效。
方案二:显式调用into_iter()获取所有权迭代器
如果你需要明确表达“转移所有权”的意图,可以调用into_iter()方法,它会把HashMap转换成输出所有权键值对的迭代器,效果和方案一完全一致:
let mut track_nums: HashMap<String, u64> = HashMap::new(); for id in client.find_album(artist, album) { track_nums.extend(client.get_tracks(id).into_iter()); }
额外说明
为什么iter()不行?iter()是借用迭代器,它只会返回HashMap中元素的引用,不会转移所有权。而你的目标HashMaptrack_nums需要的是真正拥有的String和u64对象,不是引用,所以编译器会抛出类型不匹配的错误。
内容的提问来源于stack exchange,提问作者user693861
相关产品推荐
相关产品推荐

