我将如何习惯性地在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()]);
}

推荐答案

假设您希望StringHashMap<String, String>的灵活性是正确的.另一个 Select 是&str,但这对HashMap的使用方式/传播地点造成了重大限制;但如果它起作用,将一个或两个参数更改为&str将更有效率.这个 Select 应该取决于您需要什么样的所有权语义,以及字符串的动态性,更多信息请参见this answerthe 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.)

Rust相关问答推荐

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

通用池类型xsx

泛型属性比较

修改切片/引用数组

为潜在的下游实现使用泛型绑定而不是没有泛型绑定的trait

原始数组数据类型的默认trait实现

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

`RwLockWriteGuard_,T`不实现T实现的特征

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

使用关联类型重写时特征的实现冲突

Rust从关联函数启动线程

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

存储返回 impl Trait 作为特征对象的函数

Rust 中指向自身的引用如何工作?

max(ctz(x), ctz(y)) 有更快的算法吗?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

返回引用字符串的future

从函数返回 u32 的数组/切片

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())