我如何以生成方式创建字符串以生成字符串hashmap。以下是有效的,但这是正确的方法吗?我应该使用不同类型的字符串吗?
use std::collections::hashmap::HashMap;
//use std::str;
fn main() {
let mut mymap = HashMap::new();
mymap.insert("foo".to_string(), "bar".to_string());
println!("{0}", mymap["foo".to_string()]);
}
答案 0 :(得分:12)
假设您希望String
的灵活性,HashMap<String, String>
是正确的。另一个选择是&str
,但这对HashMap
如何使用/可以传递的位置施加了重大限制;但如果它有效,将一个或两个参数更改为&str
将更有效。这个选择应该取决于您需要什么样的所有权语义,以及字符串的动态性,请参阅this answer和the strings guide了解更多信息。
顺便说一句,使用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
一样,没有分配(如the name suggests)。它返回一个可以取消引用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")]);
}
(有一个类似的std::vec::as_vec
。)