Подтвердить что ты не робот

Обновить значение в изменчивом 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}
}

Вызывает следующую ошибку:

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

Я действительно не понимаю, что это значит, так как я сделал HashMap изменчивым. Когда я пытаюсь обновить элемент в vector, я получаю ожидаемый результат:

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

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

Чем отличается HashMap, что я получаю вышеуказанную ошибку? Есть ли способ обновить значение?

4b9b3361

Ответ 1

Индексирование неизменно и индексирование изменчиво обеспечивается двумя разными признаками: Index и IndexMut, соответственно.

В настоящее время HashMap не реализует IndexMut, а Vec делает.

В фиксации, которая удалила реализацию HashMap IndexMut, говорится:

Эта фиксация удаляет указатели IndexMut на HashMap и BTreeMap, в для обеспечения будущего API для возможного включения Значок IndexSet.

Я понимаю, что гипотетическая черта IndexSet позволит вам назначать новые значения HashMap, а не просто читать или мутировать существующие записи:

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

В настоящее время вы можете использовать get_mut:

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

Или entry API:

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