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

Ric*_*van 7 rust

我想知道最佳实践来处理None从a获取值的结果HashMap.鉴于我有一个简单的功能:

pub fn get_value(&self, value: String) -> &String {
Run Code Online (Sandbox Code Playgroud)

人们可以得到的值HashMapunwrap:

my_map.get(&"hello".to_string()).unwrap()
Run Code Online (Sandbox Code Playgroud)

但如果它得到,我不希望它感到恐慌None.我还可以做些什么?

match self.os_config.get(&value) {
    Some(val) => return &val,
    None =>  //?? cannot return a String::new().. as it is temporal?
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*gan 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 => "",
    }
}
Run Code Online (Sandbox Code Playgroud)

这也可以使用方便的unwrap_or方法编写:

pub fn get_value(&self, value: &str) -> &str {
    self.os_config.get(value).unwrap_or("")
}
Run Code Online (Sandbox Code Playgroud)

因此,回归Option<&str>也许并不那么乏味; .unwrap_or("")如果他们想要,其他地方可以添加.当然,这一切都取决于所需的语义.