我正在寻找一种方法来更新一个不变的HashMap的值.

我不想插入或删除HashMap中的值,只想更新现有的值.

所以我将HashMap对象保持为不变,但有了它,我就不能更新存储在map中的值.

以下是示例代码:

fn main() {
    let map = std::collections::HashMap::from([(1,1)]);
    println!("{map:?}");
    match map.get_mut(&1) {
        None=>{},
        Some(val)=>*val=2,
    }
    println!("{map:?}");
}

我已经知道了,把map变成mut这个代码行得通.但我想知道

  1. 为什么我无法更改包含在map中的对象?
  2. 在Rust中有没有哈希图的实现,我可以在其中更改不变的map上包含的值?

Playground link

Side Note:Why do I need this?.

I want to protect map object with 100 (or similar concepts), so some code can add/remove to map object and some code can just update existing object.

推荐答案

您需要使用interior mutability:

use std::{cell::RefCell, collections::HashMap};
    
fn main() {
    let aa = HashMap::from([(1, RefCell::new(1))]);
    println!("{:?}",aa);
    if let Some(value) = aa.get(&1) {
        let mut value = value.borrow_mut();
        *value = 2;
    }
    println!("{:?}",aa);
}

结果:

{1: RefCell { value: 1 }}
{1: RefCell { value: 2 }}

Rust相关问答推荐

Tauri tauri—apps/plugin—store + zustand

如何使用Match比较 struct 中的值

如果A == B,则将Rc A下推到Rc B

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

在析构赋值中使用一些现有绑定

如何循环遍历0..V.len()-1何时v可能为空?

铁 rust 中的泛型:不能将`<;T作为添加>;::Output`除以`{Float}`

Rust 的多态现象.AsRef与Derf

如何go 除多余的(0..)在迭代中,当它不被使用时?

在Rust中声明和定义一个 struct 体有什么区别

如何将生存期参数添加到框<>;具有dyn类型别名

需要哪些编译器优化来优化此递归调用?

如何获取模块树?

方法可以被误认为是标准特性方法

如何判断服务器是否正确接收数据

如何获取函数中borrow 的切片的第一部分?

将 Futures 的生命周期特征绑定到 fn 参数

如何解析 Rust 中的 yaml 条件字段?

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

提取 struct 生成宏中字段出现的索引