如何在Rust中创建和使用字符串来串联Hashmap?

时间:2014-10-12 09:32:25

标签: rust

我如何以生成方式创建字符串以生成字符串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()]);
}

1 个答案:

答案 0 :(得分:12)

假设您希望String的灵活性,HashMap<String, String>是正确的。另一个选择是&str,但这对HashMap如何使用/可以传递的位置施加了重大限制;但如果它有效,将一个或两个参数更改为&str将更有效。这个选择应该取决于您需要什么样的所有权语义,以及字符串的动态性,请参阅this answerthe 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")]);
}

playpen

(有一个类似的std::vec::as_vec。)