如果HashMap为空,从HashMap中删除值的惯用方法是什么?

时间:2017-05-10 12:22:20

标签: rust

以下代码有效,但由于is_empty的定义与使用距离太远,因此效果不佳。

fn remove(&mut self, index: I, primary_key: &Rc<K>) {
    let is_empty;
    {
        let ks = self.data.get_mut(&index).unwrap();
        ks.remove(primary_key);
        is_empty = ks.is_empty();
    }
    // I have to wrap `ks` in an inner scope so that we can borrow `data` mutably.
    if is_empty {
        self.data.remove(&index);
    }
}

我们是否有一些方法可以在输入if分支之前删除变量,例如

if {ks.is_empty()} {
    self.data.remove(&index);
}

2 个答案:

答案 0 :(得分:8)

每当您对密钥进行双重查找时,您需要考虑Entry API

使用条目API,您可以获得键值对的句柄,并且可以:

  • 读取密钥,
  • 读取/修改值,
  • 完全删除条目(获取密钥和值)。

它非常强大。

在这种情况下:

use std::collections::HashMap;
use std::collections::hash_map::Entry;

fn remove(hm: &mut HashMap<i32, String>, index: i32) {
    if let Entry::Occupied(o) = hm.entry(index) {
        if o.get().is_empty() {
            o.remove_entry();
        }
    }
}

fn main() {
    let mut hm = HashMap::new();
    hm.insert(1, String::from(""));

    remove(&mut hm, 1);

    println!("{:?}", hm);
}

答案 1 :(得分:1)

我最后这样做了:

match self.data.entry(index) {
    Occupied(mut occupied) => {
        let is_empty = {
            let ks = occupied.get_mut();
            ks.remove(primary_key);
            ks.is_empty()
        };
        if is_empty {
            occupied.remove();
        }

    },
    Vacant(_) => unreachable!()
}