I'm wondering with the best practice to handle the None
result in getting values from a HashMap
. Given I have a simple function:
pub fn get_value(&self, value: String) -> &String {
One could get the value from the HashMap
with unwrap
:
my_map.get(&"hello".to_string()).unwrap()
But I don’t want it to panic if it gets None
. What else can I do?
match self.os_config.get(&value) {
Some(val) => return &val,
None => //?? cannot return a String::new().. as it is temporal?
}
For starters, &String
is a type that should never exist in a signature; you should take the more general &str
. String
is specifically an owned string, while &str
is a string slice. Because String
implements Deref<Target = str>
, &String
coerces to &str
.
When dealing with hash map keys, you should also take &str
rather than &String
, and you should avoid taking String
if all you need is &str
; you don’t need to consume the string. You can index a HashMap<String, _>
with &str
just fine.
The type of a string literal is &'static str
; &'static str
will quite happily coerce to &'a str
for any 'a
, so you can quite happily use an empty string literal on the None
branch. Here’s the result:
pub fn get_value(&self, value: &str) -> &str {
match self.os_config.get(value) {
Some(val) => val,
None => "",
}
}
This can also be written using the handy unwrap_or
method:
pub fn get_value(&self, value: &str) -> &str {
self.os_config.get(value).unwrap_or("")
}
For this reason, returning an Option<&str>
is perhaps not so tedious; other places can add .unwrap_or("")
if they want to. Of course, it all depends on the desired semantics.
If you need to return an arbitrary type or result, such that you can't use a 'static
reference, you can return a Cow
type from the function.
A simple demo is at Holy std::borrow::Cow!, but you basically just have to wrap it in a Cow::Borrowed
normally and a Cow::Owned
for the error case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With