Während ein LeetCode Problem mit Rost zu lösen versuchen, traf ich ein seltsames Problem: es sieht aus wie ich keine HashMap
mit primitiven Typen erstellen:erstellen HashMap <i32, i32> in Rust
use std::collections::HashMap;
fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
match map.get(target - x) {
Some(k) => return (k, i),
None => map.insert(x, i)
};
}
return (0, 0);
}
fn main() {
let ret = two_sum(&vec![1,2,3], 4);
println!("{}, {}", ret.0, ret.1);
}
Der Compiler beschwert sich:
error[E0308]: mismatched types
--> two_sum.rs:6:23
|
6 | match map.get(target - x) {
| ^^^^^^^^^^ expected reference, found i32
|
= note: expected type `&_`
= note: found type `i32`
error[E0308]: mismatched types
--> two_sum.rs:7:32
|
7 | Some(k) => return (k, i),
| ^expected usize, found reference
|
= note: expected type `usize`
= note: found type `&_`
Ist es notwendig, immer Bezug mit HashMap in Rust verwenden?
EDIT:
Sieht aus wie es notwendig ist ... Die Lösung ein bisschen hässlich, aber Werke sieht sowieso.
Ich frage mich, ob es eine bessere Lösung oder einige beste Praxis gibt, HashMaps mit primitiven Typen zu verwenden?
Die Signatur [std :: Sammlungen :: HashMap :: get] (https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.get) sagt ja , verwende eine Referenz. – ljedrz
Hinweis: Es ist idiomatischer für 'two_sum', ein' & [i32] 'Argument zu nehmen (da es eine strikte Obermenge möglicher Argumente zulässt). –