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ยง
- Make a new
Ref
for a optional component of the borrowed data, e.g. an enum variant. - Make a new
RefMut
for a optional component of the borrowed data, e.g. an enum variant.