Sto cercando di capire come funzionano HashMaps in Rust e ho creato questo esempio.Dereferenziazione di stringhe e HashMaps in Rust
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
}
Quando provo a compilare il codice con ultima riga non commentata, ottengo il seguente errore
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
La sezione implementazione volto della docs dà la dereferenziazione come fn deref(&self) -> &str
Allora, qual è sta succedendo qui?
Penso che sia sbagliato (di chiunque abbia scritto 'HashMap :: get') utilizzare il tratto 'Prendi in prestito' qui. Fondamentalmente il legame generico dice: puoi passare un riferimento a qualsiasi tipo a 'get', se il tipo-chiave è preso in prestito come quel tipo. In realtà dovrebbe essere: puoi passare qualsiasi tipo a 'get', purché quel tipo sia coercibile al tipo di chiave. Ma non possiamo sistemarlo all'indietro compatibilmente :( –