hashmap - 如何为包含具有可变引用的 HashMap 的结构实现 find_or_create 方法

标签 hashmap rust

我在处理包含 rust 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>
}    

我想在管理器上定义一个方法,它接受一个键,如果没有找到则返回一个未锁定的条目,如果存在则返回现有的条目。这是伪代码:

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 中是如何工作的。有什么指点吗?

最佳答案

我通过将 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)
}

有没有更好的办法?

关于hashmap - 如何为包含具有可变引用的 HashMap 的结构实现 find_or_create 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427944/

相关文章:

function - 在函数内部定义结构是对其他函数隐藏结构的好方法吗?

c++ - 我尝试定义一个 hash_map 变量在 VS2008 中对我不起作用

java - 我尝试将 ExpandableListView 与自定义适配器一起使用,但无法显示任何内容

rust - "cannot find value __collect"将 flatten 添加到枚举结构变体时

rust - 为什么编译器不自动在声明性宏中添加双括号?

rust - 借用为迭代器可变后,在循环内借用为不可变

rust - 如何为结构实现 Ord?

java - 如何转换 hashmap.values().toArray() ,其中这些 value() 也是 HashMap ?

java - 为什么 java hashmap 在计数为 8 时对 bin 进行树形化,而在计数为 6 时对 bin 进行树形化?

java - 如何自动增加 HashMap 中的键?