我想知道最佳实践来处理None从a获取值的结果HashMap.鉴于我有一个简单的功能:
pub fn get_value(&self, value: String) -> &String {
Run Code Online (Sandbox Code Playgroud)
人们可以得到的值HashMap用unwrap:
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("")如果他们想要,其他地方可以添加.当然,这一切都取决于所需的语义.
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |