我正在尝试高效地查找或将项目插入同时拥有其键和值的HashMap
中。
根据How to lookup from and insert into a HashMap efficiently?,Entry
API是实现此目的的方法。
但是,在插入新项目时,我还需要访问密钥。
由于HashMap::entry
使用了密钥,因此我无法执行以下操作,失败了,error[E0382]: borrow of moved value: 'index'
:
let mut map: HashMap<String, Schema> = ...;
let index: String = ...;
let schema = map
.entry(index)
.or_insert_with(|| Schema::new(&index));
最简单的方法如下:
let schema = match map.entry(index) {
Entry::Occupied(e) => e.into_mut(),
Entry::Vacant(e) => {
// VacantEntry::insert consumes `self`,
// so we need to clone:
let index = e.key().to_owned();
e.insert(Schema::new(&index))
}
};
如果仅or_insert_with
会将Entry
传递到它所调用的闭包,则可以编写上述代码,如下所示:
let schema = map
.entry(index)
.or_insert_with_entry(|e| {
let index = e.key().to_owned();
Schema::new(&index)
});
我忽略了什么吗?编写此代码的最佳方法是什么?