这是我想要做的事情:
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;
// I expect my_map becomes {"b": 3, "a": 11}
}
但是这会产生一个错误:
Rust 2015
error[E0594]: cannot assign to immutable indexed content
--> src/main.rs:8:5
|
8 | my_map["a"] += 10;
| ^^^^^^^^^^^^^^^^^ cannot borrow as mutable
|
= help: trait `IndexMut` is required to modify indexed content, but it is not implemented for `std::collections::HashMap<&str, i32>`
Rust 2018
error[E0594]: cannot assign to data in a `&` reference
--> src/main.rs:8:5
|
8 | my_map["a"] += 10;
| ^^^^^^^^^^^^^^^^^ cannot assign
我其实不太明白那是什么意思,因为我将 HashMap
设为了可变的。当我尝试更新 vector
中的一个元素时,我得到了预期的结果:
let mut my_vec = vec![1, 2, 3];
my_vec[0] += 10;
println! {"{:?}", my_vec};
// [11, 2, 3]
HashMap
有什么不同,导致我收到了上面的错误?有没有一种方法可以更新值?
(*(my_map.entry("a").or_insert(42))) += 10;
。该代码的意思是:如果 "a" 这个键存在于my_map
字典中,那么就将它对应的值加上 10;如果 "a" 这个键不存在于my_map
字典中,则将键值对 "a:42" 添加到字典中,然后将值加上 10。 - Shepmasterlet tmp = my_map.entry("a").or_insert(some_default); tmp.a += 1; tmp.b += 2
. @GermanFaller让tmp=my_map.entry("a").or_insert(some_default); tmp.a += 1; tmp.b += 2
。 - Shepmaster