entry_and_modify
The tracking issue for this feature is: #44733
This introduces a new method for the Entry API of maps
(std::collections::HashMap
and std::collections::BTreeMap
), so that
occupied entries can be modified before any potential inserts into the
map.
For example:
#![feature(entry_and_modify)] # fn main() { use std::collections::HashMap; struct Foo { new: bool, } let mut map: HashMap<&str, Foo> = HashMap::new(); map.entry("quux") .and_modify(|e| e.new = false) .or_insert(Foo { new: true }); # }
This is not possible with the stable API alone since inserting a default
before modifying the new
field would mean we would lose the default state:
# fn main() { use std::collections::HashMap; struct Foo { new: bool, } let mut map: HashMap<&str, Foo> = HashMap::new(); map.entry("quux").or_insert(Foo { new: true }).new = false; # }
In the above code the new
field will never be true
, even though we only
intended to update that field to false
for previously extant entries.
To achieve the same effect as and_modify
we would have to manually match
against the Occupied
and Vacant
variants of the Entry
enum, which is
a little less user-friendly, and much more verbose:
# fn main() { use std::collections::HashMap; use std::collections::hash_map::Entry; struct Foo { new: bool, } let mut map: HashMap<&str, Foo> = HashMap::new(); match map.entry("quux") { Entry::Occupied(entry) => { entry.into_mut().new = false; }, Entry::Vacant(entry) => { entry.insert(Foo { new: true }); }, }; # }