为什么hash_map :: Entry :: or_insert_with无法访问条目的键?

时间:2019-09-10 13:17:27

标签: rust hashmap

我正在尝试高效地查找或将项目插入同时拥有其键和值的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)
    });

我忽略了什么吗?编写此代码的最佳方法是什么?

0 个答案:

没有答案