假设你需要String的灵活性,那么HashMap<String, String>是正确的选择。另一个选择是&str,但这会对HashMap的使用方式/传递方式施加重大限制;但如果它能工作,将一个或两个参数更改为&str将更有效率。这个选择应由您需要什么样的所有权语义和字符串有多动态决定,有关详细信息请参见该回答和字符串指南。
顺便说一句,在HashMap<String, ...>中搜索String可能很昂贵:如果您没有,则需要分配一个新的String。我们有一个解决方法,即通过find_equiv
形式来传递字符串字面值(更一般地说,任何&str)而不分配新的String:
use std::collections::HashMap;
fn main() {
let mut mymap = HashMap::new();
mymap.insert("foo".to_string(), "bar".to_string());
println!("{}", mymap.find_equiv(&"foo"));
println!("{}", mymap.find_equiv(&"not there"));
}
playpen(注意我在返回值中保留了Option
,可以调用.unwrap()
或适当处理缺少的键)。
另一个稍微不同的选项(在某些情况下更通用,在其他情况下不太通用)是std::string::as_string
函数,它允许将&str
中的数据视为&String
,而无需分配内存(正如名称所示)。它返回一个可以被解引用为String
的对象,例如:
use std::collections::HashMap;
use std::string;
fn main() {
let mut mymap = HashMap::new();
mymap.insert("foo".to_string(), "bar".to_string());
println!("{}", mymap[*string::as_string("foo")]);
}
playpen
(类似的还有一个 std::vec::as_vec
。)
&'static str
(字符串字面量)来做吗,特别是对于键值? - Chris Morgan