如何在 Rust HashMap 中为同一个键存储多个元素?

How can I store multiple elements in a Rust HashMap for the same key?

我有一个HashMap<u32, Sender>Sender 是一个打开的连接对象,key 是一个用户id。每个用户可以从多个设备连接。我需要为同一用户 ID 存储所有可能的打开连接。在此之后,我可以迭代并将消息发送到同一用户的所有打开的连接。

以上HashMap只存储每个用户id和连接一次。我需要获得一个具有多个值的键。我怎样才能把这个值变成一个列表或数组,这样我就可以看到存在哪些连接并将它们全部发送给它们?

我不是在谈论不同的值类型,比如枚举。我说的是相同的类型值,但不止一个。也许 HashMap 不是为此设计的?

也欢迎其他想法。

要使用 HashMap 执行此操作,您应该使用 Vec 作为值,以便每个键可以指向多个 Sender。那么类型将是 HashMap<u32, Vec<Sender>>.

使用此结构,当您需要像这样改变值时,仅使用 insert() 会变得笨拙,但您可以使用 Entry API 来检索和更新记录一气呵成。例如:

let mut hash_map: HashMap<u32, Vec<Sender>> = HashMap::new();

hash_map.entry(3)
    // If there's no entry for key 3, create a new Vec and return a mutable ref to it
    .or_default()
    // and insert the item onto the Vec
    .push(sender); 

您也可以使用 multimap crate,它在后台执行类似的操作,但增加了一个抽象层。您可能会发现使用它更容易:

let mut multi_map = MultiMap::new();

multi_map.insert(3, sender_1);
multi_map.insert(3, sender_2);

方法 multi_map.get(key) 将使用该键获取第一个值,而 multi_map.get_vec(key) 将检索所有这些值。