gpt4 book ai didi

rust - 如何更新HashMap中的 key ?

转载 作者:行者123 更新时间:2023-12-03 11:40:39 25 4
gpt4 key购买 nike

我找不到任何方法可以更新HashMap的 key 。有 get_key_value ,但是它返回不可变的引用而不是可变的引用。

最佳答案

通常,您不能。从 HashMap 文档中:

It is a logic error for a key to be modified in such a way that the key's hash, as determined by the Hash trait, or its equality, as determined by the Eq trait, changes while it is in the map. This is normally only possible through Cell, RefCell, global state, I/O, or unsafe code.


取而代之的是,删除该值并重新插入它:
use std::{collections::HashMap, hash::Hash};

fn rename_key<K, V>(h: &mut HashMap<K, V>, old_key: &K, new_key: K)
where
K: Eq + Hash,
{
if let Some(v) = h.remove(old_key) {
h.insert(new_key, v);
}
}
也可以看看:
  • Changing key of HashMap from child method

  • 1 —如文档所述,只要您不更改 key 的散列或比较方式,就可以对其进行修改。这样做将导致 HashMap处于无效状态。
    正确执行此操作的示例(但仍是可疑的原因):
    use std::{
    cell::RefCell,
    collections::HashMap,
    hash::{Hash, Hasher},
    sync::Arc,
    };

    #[derive(Debug)]
    struct Example<A, B>(A, B);

    impl<A, B> PartialEq for Example<A, B>
    where
    A: PartialEq,
    {
    fn eq(&self, other: &Self) -> bool {
    self.0 == other.0
    }
    }

    impl<A, B> Eq for Example<A, B> where A: Eq {}

    impl<A, B> Hash for Example<A, B>
    where
    A: Hash,
    {
    fn hash<H>(&self, h: &mut H)
    where
    H: Hasher,
    {
    self.0.hash(h)
    }
    }

    fn main() {
    let mut h = HashMap::new();
    let key = Arc::new(Example(0, RefCell::new(false)));

    h.insert(key.clone(), "alpha");
    dbg!(&h);

    *key.1.borrow_mut() = true;
    dbg!(&h);
    }
    您还可以使用其他技术来获取对 key 的可变引用,例如不稳定的 raw_entry_mut (如 mentioned by Sven Marnach)。

    关于rust - 如何更新HashMap中的 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65580524/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com