以下是我想做的:

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变了.当我try 更新vector中的一个元素时,我得到了预期的结果:

let mut my_vec = vec![1, 2, 3];

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

我得到的上述错误与HashMap有什么不同?有没有办法更新一个值?

推荐答案

不可变索引和可变索引分别由两个不同的特性提供:IndexIndexMut.

目前,HashMap不实现IndexMut,而Vec does.

The commit that removed HashMap's IndexMut implementation个国家:

此提交将删除HashMap和BTreeMap上的IndexMut impls,在

我的理解是,假设的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;

Rust相关问答推荐

Rust kill std::processs::child

Rust:跨多个线程使用hashmap Arc和rwlock

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

告诉Rust编译器返回值不包含构造函数中提供的引用

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

如何正确重新排列代码以绕过铁 rust 借入判断器?

解析程序无法在Cargo 发布中 Select 依赖版本

习语选项<;T>;到选项<;U>;当T->;U用From定义

Rust 中什么时候可以返回函数生成的字符串切片&str?

提取指向特征函数的原始指针

结果流到 Vec 的结果:如何避免多个into_iter和collect?

sha256 摘要仅适用于 &*

Button.set_hexpand(false) 不会阻止按钮展开

中文优化标题:跳出特定循环并返回一个值

通过mem::transmute将数组展平安全吗?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

如何连接 Rust 中的相邻切片

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

为什么拥有 i32 所有权的函数需要它是可变的?