私はHustMapsがRustでどのように動作するかを理解しようとしています。Rustで文字列とHashMapsを間接的に参照する
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
を取得docsの形質実装セクションがfn deref(&self) -> &str
としてデリファレンスを与えだから何がありますここで起こっている?
ここで 'Borrow'特性を使うのは間違っていると思います(' HashMap :: get'を作成した人の誰か)。基本的には、ジェネリックバウンドには、キータイプがそのタイプとして借用可能である場合には、任意のタイプへの参照を 'get'に渡すことができます。実際には、キー型と互換性がある限り、どの型も 'get'に渡すことができます。しかし、私たちはこれを後方互換性を修正することはできません:( –