2015-05-23 7 views
23

Ecco quello che sto cercando di fare:valore di aggiornamento in HashMap mutevole

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} 
} 

Aumenta il seguente errore:

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

Io non capisco che cosa significa, da quando ho fatto il HashMap mutabile. Quando provo ad aggiornare un elemento in un vector, ottengo il risultato atteso:

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

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

Qual è la differenza HashMap che sto ottenendo l'errore di cui sopra? C'è un modo per aggiornare un valore?

risposta

37

L'indicizzazione immutabile e l'indicizzazione sono disponibili in due modi diversi: Index e IndexMut, rispettivamente.

Attualmente, HashMap non implementa IndexMut, mentre Vec does.

The commit that removed HashMap's IndexMut implementation stati:

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.

E 'la mia comprensione che un ipotetico IndexSet caratteristica permetterebbe di assegnare valori nuovi di zecca a un HashMap, e non solo leggere o mutare le voci esistenti:

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

Per ora, è possibile utilizzare get_mut:

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

O il entry API:

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

Molto utile! Grazie. – Akavall

+1

Si prevede che IndexMut sarà implementato in futuro? –

+3

@LukeDupin dubbioso. Al suo posto sarebbe implementata l'ipotetica caratteristica 'IndexSet'. – Shepmaster