假设您希望String
、HashMap<String, String>
的灵活性是正确的.另一个 Select 是&str
,但这对HashMap
的使用方式/传播地点造成了重大限制;但如果它起作用,将一个或两个参数更改为&str
将更有效率.这个 Select 应该取决于您需要什么样的所有权语义,以及字符串的动态性,更多信息请参见this answer和the strings guide.
顺便说一句,用String
搜索HashMap<String, ...>
可能会很昂贵:如果你还没有,就需要分配一个新的String
.我们有一个find_equiv
形式的变通方法,它允许您在不分配新的String
的情况下传递字符串文字(更一般地说,任何&str
):
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).它返回一个对象,该对象可以被解引用到.
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
.)