如何为包含带有可变引用的hashmap的struct实现find_or_create方法

时间:2015-10-30 02:57:43

标签: hashmap rust

我在使用包含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的工作原理。有什么指针吗?

1 个答案:

答案 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)
}

有更好的方法吗?