HashMap<_, HashSet<_>> 的递归实现扩展,其中集合组合,而不是覆盖?

问题描述

我正在尝试将我的代码调整为 a solution to my previous question。基本上,我有一个 HashMap<String,HashSet<String>> 应该由人造丝的 par_extend 生成。问题是键重复,在这种情况下,我希望 HashSet 被组合,而不是被覆盖。换句话说,有没有办法在这里添加一个自定义impl Extend,以便下面的代码正确执行?

use std::collections::{HashMap,HashSet};

fn main() {
    let mut d: HashMap<String,HashSet<String>> = HashMap::new();

    d.extend(vec![1,2].iter().map(|x| {
        let mut z = HashSet::new();
        z.insert(x.to_string());
        return ("a".into(),z);
    }));

    assert_eq!(d.get("a").unwrap().len(),2);
}

解决方法

因为 orphan rules,你不能。但是,您可以定义一个廉价的包装器,为该包装器实现 https://maven.fabric.io/public,进行扩展,然后再次解开原始地图。也许是这样的:

Extend

Playground