我正在尝试理解Rust中HashMap的工作原理,我想出了这个例子。
use std::collections::HashMap;
fn main() {
let mut roman2number: HashMap<&'static str, i32> = HashMap::new();
roman2number.insert("X", 10);
roman2number.insert("I", 1);
let roman_num = "XXI".to_string();
let r0 = roman_num.chars().take(1).collect::<String>();
let r1: &str = &r0.to_string();
println!("{:?}", roman2number.get(r1)); // This works
// println!("{:?}", roman2number.get(&r0.to_string())); // This doesn't
}
当我尝试编译取消注释的最后一行代码时,会出现以下错误。
error: the trait bound `&str: std::borrow::Borrow<std::string::String>` is not satisfied [E0277]
println!("{:?}", roman2number.get(&r0.to_string()));
^~~
note: in this expansion of format_args!
note: in this expansion of print! (defined in <std macros>)
note: in this expansion of println! (defined in <std macros>)
help: run `rustc --explain E0277` to see a detailed explanation
在 文档 的 Trait implementation 部分中,对解引用的说明如下:fn deref(&self) -> &str
那么这里到底发生了什么呢?
HashMap :: get
)在这里使用Borrow
特质是错误的。基本上,泛型限制表示:您可以将对任何类型的引用传递给get
,如果键类型可借用为该类型。实际上应该是:只要该类型可以强制转换为键类型,就可以将任何类型传递给get
。但是我们无法以向后兼容的方式修复此问题 :( - oli_obk