Expand description
The Ref and RefMut types in std::cell each have a map method that create
a new Ref (RefMut) that borrows something (a sub-component) inside of a RefCell.
When that component may or may not be there, you may find yourself checking for its precense twice:
fn borrow_get<'a>(hashmap: &'a RefCell<HashMap<String, String>>, key: &str)
-> Option<Ref<'a, String>> {
let hashmap = hashmap.borrow();
if hashmap.contains_key(key) { // Duplicated hash table lookup.
Some(Ref::map(hashmap, |hashmap| {
&hashmap[key] // panic!() for missing key unlikely to be optimized away
}))
} else {
None
}
}This crate define ref_filter_map and ref_mut_filter_map functions
that are a lot like Ref::map and RefMut::map,
but return Option and take closures that return Option.
Internally they use a raw pointer and some unsafe code,
but the API they provide is believed to be safe.
This was once part of std::cell but has been deprecated there since it makes Option
too much of a special case.
https://github.com/rust-lang/rust/pull/25747 https://github.com/rust-lang/rust/issues/27746
Functionsยง
- ref_
filter_ map - Make a new
Reffor a optional component of the borrowed data, e.g. an enum variant. - ref_
mut_ filter_ map - Make a new
RefMutfor a optional component of the borrowed data, e.g. an enum variant.