假设我有一个哈希映射m: HashMap<K, V>
,一个键k: K
和一个值v: V
,并希望执行以下操作:
m
不包含在索引值k
,插入v
索引k
。m
包含一个值w
,则将k
函数fn combine(x: V, y: V) -> Option<V>
应用于v
和w
,以及:
None
,请k
从中删除索引处的条目m
。Some(u)
,在指数更换价值k
的u
。有没有一种方法可以“就地”执行此操作,而无需调用k
多次访问,修改或删除该值的函数?
我也想避免复制数据,因此最好不应该需要克隆v
的克隆送入insert
和combine
分开。
我可以重写combine
以使用(可变)引用(或内联它),但仍然存在不复制数据的愿望。
深入研究Entry
文档,我注意到Entry
枚举的变体提供了用于就地修改,删除或插入条目的功能。
考虑std::collections::hash_map::Entry
范围之后,可以执行以下操作:
match m.entry(k) {
Entry::Occupied(mut oe) => {
let w = oe.get_mut();
match combine(v, w) {
Some(u) => { *w = u; },
None => { oe.remove_entry(); },
}
},
Entry::Vacant(ve) => { ve.insert(v); },
}
(这是Rust游乐场中的PoC。)
但是,这需要combine
将(可变)引用作为其第二个参数(在我的情况下很好)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句