成语从地图成员字段获取或创建可变集合

时间:2016-12-27 19:06:28

标签: rust

我有一个HashMap成员的类型,其值为HashSet。如果HashMap不包含给定密钥,我需要创建一个新的HashSet并将其添加到地图中。

由于我的类型中有多个类似的成员,我想创建一个方法来处理它。

可悲的是,我总是最终有多个可变借词add_to_index

我该如何解决这个问题还是有更好的习语?

use std::collections::HashMap;
use std::collections::HashSet;

struct TopicIndex {
    all: HashSet<String>,
    topicsByName: HashMap<String, HashSet<String>>,
    rootsByName: HashMap<String, HashSet<String>>,
    endsByName: HashMap<String, HashSet<String>>,
}

enum IndexType {
    Roots,
    ByName,
    Ends,
}

impl TopicIndex {
    pub fn new() -> Self {
        TopicIndex {
            all: HashSet::with_capacity(32),
            topicsByName: HashMap::with_capacity(128),
            rootsByName: HashMap::with_capacity(128),
            endsByName: HashMap::with_capacity(128),
        }
    }

    // [...]

    fn add_to_index(&mut self, name: String, topic: String, indexType: IndexType) {
        let mut index = match indexType {
            IndexType::ByName => &mut self.topicsByName,
            IndexType::Roots => &mut self.rootsByName,
            IndexType::Ends => &mut self.endsByName,
        };
        // first mutable borrow occurs here
        let mut setOpt = index.get_mut(&name);
        if setOpt.is_some() {
            setOpt.unwrap().insert(topic);
        } else {
            let mut set = HashSet::with_capacity(32);
            set.insert(topic);
            // second mutable borrow occurs here
            index.insert(name, set);
        }
    }
}

0 个答案:

没有答案