如何从HashMap.get的无案例中返回一些内容?

时间:2015-07-16 21:55:20

标签: rust

我想知道最佳做法是处理从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?
}

2 个答案:

答案 0 :(得分:14)

首先,&String是一种永远不应存在于签名中的类型;你应该采取更一般的&strString特别是拥有的字符串,而&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的错误情况下。

相关问题