支持String和&str的Hashmap

时间:2019-06-20 03:23:59

标签: rust borrowing

如何定义HashMap的键和内容同时支持String&str?我尝试了以下方法:

fn mapping<T: Into<String>>() -> HashMap<T, T> {
  let mut map: HashMap<T, T> = HashMap::new();
  map.insert("first_name", "MyFirstName");
  map.insert("last_name".to_string(), "MyLastName".to_string());
  map
}

fn main() {
  let mut mapping = mapping();
}

但是它不能编译,说:

error[E0599]: no method named `insert` found for type `std::collections::HashMap<T, T>` in the current scope
error[E0277]: the trait bound `T: std::cmp::Eq` is not satisfied
error[E0277]: the trait bound `T: std::hash::Hash` is not satisfied

1 个答案:

答案 0 :(得分:2)

提取数据是借用还是拥有的内置方法是Cow

use std::borrow::Cow;
use std::collections::HashMap;

fn mapping() -> HashMap<Cow<'static, str>, Cow<'static, str>> {
    let mut map = HashMap::new();
    map.insert("first_name".into(), "MyFirstName".into());
    map.insert("last_name".to_string().into(), "MyLastName".to_string().into());
    map
}

&strString都可以使用Cow<str>转换为.into()