我想知道最佳做法是处理从None
获取值的HashMap
结果。鉴于我有一个简单的功能:
pub fn get_value(&self, value: String) -> &String {
可以使用HashMap
来获取unwrap
的值:
my_map.get(&"hello".to_string()).unwrap()
但如果得到None
,我不希望它感到恐慌。我还能做什么?
match self.os_config.get(&value) {
Some(val) => return &val,
None => //?? cannot return a String::new().. as it is temporal?
}
答案 0 :(得分:14)
首先,&String
是一种永远不应存在于签名中的类型;你应该采取更一般的&str
。 String
特别是拥有的字符串,而&str
是字符串切片。由于String
实施Deref<Target = str>
,&String
强制执行&str
。
在处理哈希映射键时,您还应该使用&str
而不是&String
,如果您需要的是String
,则应该避免使用&str
;你不需要消耗字符串。您可以使用HashMap<String, _>
索引&str
就好了。
字符串文字的类型是&'static str
;对于任何&'static str
,&'a str
都会非常高兴地强制'a
,因此您可以非常愉快地在None
分支上使用空字符串文字。结果如下:
pub fn get_value(&self, value: &str) -> &str {
match self.os_config.get(value) {
Some(val) => val,
None => "",
}
}
这也可以使用方便的unwrap_or
方法编写:
pub fn get_value(&self, value: &str) -> &str {
self.os_config.get(value).unwrap_or("")
}
出于这个原因,返回Option<&str>
也许并不那么乏味;如果他们愿意,其他地方可以添加.unwrap_or("")
。当然,这一切都取决于所需的语义。
答案 1 :(得分:2)
如果您需要返回任意类型或结果,以致不能使用'static
引用,则可以从函数返回Cow
类型。
一个简单的演示位于Holy std::borrow::Cow!,但基本上只需将其包装在Cow::Borrowed
正常和Cow::Owned
的错误情况下。