在使用哈希映射时,如果密钥不存在,通常希望添加key:value
对。
这段代码读起来不错,但并不是最优的。
if !map.contains(key) {
let val = create_val();
map.insert(key, val);
some_creation_logic(val);
} else {
let val = map[key];
some_update_logic(val);
}
当它工作时,它总是做2次查找。
我能得到的最接近的是使用Entry.or_insert
(或or_insert_with
),计算长度,以便else
分支可以采取。
let map_len_prev = map.len();
let val = map.or_insert_with(key, create_val);
if map_len_prev != map.len() {
some_creation_logic(val);
} else {
some_update_logic(val);
}
是否有一种更清晰的方法来插入一个值,当需要的时候,同时保持一种方式来运行逻辑的两个分支的情况下,它不存在/不存在?
你可以直接匹配Entry
:
use std::collections::hash_map::Entry::{Occupied, Vacant};
match map.entry(key) {
Occupied(val) => {
some_update_logic(val.get());
},
Vacant(entry) => {
let val = entry.insert(create_val());
some_creation_logic(val);
}
}