以下代码有效,但由于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);
}
答案 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!()
}