我有一个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);
}
}
}