我在使用包含hash的hashmap的结构时遇到问题。
假设我有以下类型:
pub type KeyType i32;
pub enum StatusType { Locked, Unlocked }
pub struct Entry {
key: KeyType,
status: StatusType
}
pub struct Manager<'a> {
map: HashMap<KeyType, &'a mut Entry>
}
我想在Manager上定义一个方法,该方法接受一个键,如果找不到,则返回未锁定的条目,如果存在则返回现有的条目。这是伪代码:
impl<'a> Manager<'a> {
pub fn find_or_create_entry(&'a mut self, key: KeyType) -> &'a mut Entry {
match self.map.get(&key) {
Some(e) => e,
None => {
// create new entry, add to map, and return mutable ref
}
}
}
}
我还没有弄清楚Rust的工作原理。有什么指针吗?
答案 0 :(得分:1)
我通过将HashMap的类型更改为HashMap<KeyType,Box<Entry>>
来解决这个问题,并按如下方式实现了该方法:
pub fn get_or_create_entry(& mut self, key: LockKey) -> &mut LockEntry {
let e = Box::new(LockEntry{key: key, status: LockStatus::Unlocked});
self.lock_table.entry(key).or_insert(e)
}
有更好的方法吗?