2015-05-23 10 views
23

Oto co próbuję zrobić:wartość Update w zmienny HashMap

use std::collections::HashMap; 

fn main() { 
    let mut my_map = HashMap::new(); 
    my_map.insert("a", 1); 
    my_map.insert("b", 3); 

    my_map["a"] += 10; 
    // my expected outputs is my_map becomes {"b": 3, "a": 11} 
} 

Podnosi się następujący błąd:

error: cannot assign to immutable indexed content 
--> src/main.rs:8:5 
    | 
8 |  my_map["a"] += 10; 
    |  ^^^^^^^^^^^^^^^^^ cannot borrow as mutable 

I naprawdę nie rozumiem, co to znaczy, bo uczynił HashMap zmienne. Kiedy próbuję aktualizować element w vector, uzyskać oczekiwany wynik:

let mut my_vec = vec!{1,2,3}; 

my_vec[0] += 10; 
println!{"{:?}", my_vec}; 
// [11, 2, 3] 

Jaka jest różnica HashMap że jestem coraz powyższy błąd? Czy istnieje sposób na aktualizację wartości?

Odpowiedz

37

Indykowanie niezmiennie i indeksowanie odbywa się za pomocą dwóch różnych cech odpowiednio: Index i IndexMut.

Obecnie HashMap nie implementuje IndexMut, natomiast Vec does.

The commit that removed HashMap's IndexMut implementation stany:

This commit removes the IndexMut impls on HashMap and BTreeMap, in order to future-proof the API against the eventual inclusion of an IndexSet trait.

To moja zrozumienie, że hipotetyczny IndexSet cecha pozwoli na przypisanie wartości nowiutkie do HashMap, a nie tylko czytają lub mutować istniejące wpisy:

let mut map = HashMap::new(); 
map["key"] = "value"; 

Na razie można użyć numeru get_mut:

*my_map.get_mut("a").unwrap() += 10; 

Albo entry API:

*my_map.entry("a").or_insert(42) += 10; 
+0

Bardzo pomocne! Dziękuję Ci. – Akavall

+1

Czy IndexMut ma zostać wdrożony w przyszłości? –

+3

@ Wątpliwe, czy jest to gra. W jego miejsce zaimplementowano hipotetyczną cechę "IndexSet". – Shepmaster