将条目添加到HashMap并在for循环中获取对它们的引用

时间:2018-01-23 06:17:17

标签: rust

我正在尝试在HashMap循环中向for添加多个元素,但似乎无法做到正确:

use std::collections::HashMap;

fn set_if_needed_and_get(hmap: &mut HashMap<String, String>, st: String) -> &String {
    hmap.entry(st.clone()).or_insert(st.clone())
}

fn main() {
    let meeting_one_email = ["email1", "email2", "email1"];

    let mut hmap: HashMap<String, String> = HashMap::new();
    let mut attendees: std::vec::Vec<&String> = std::vec::Vec::new();

    for m in meeting_one_email.iter() {
        attendees.push(set_if_needed_and_get(&mut hmap, m.to_string()));
    }
}

我收到错误:

error[E0499]: cannot borrow `hmap` as mutable more than once at a time
  --> src/main.rs:14:51
   |
14 |         attendees.push(set_if_needed_and_get(&mut hmap, m.to_string()));
   |                                                   ^^^^ mutable borrow starts here in previous iteration of loop
15 |     }
16 | }
   | - mutable borrow ends here

据我所知,我不能多次借用hmap可变,所以如何在仍然使用for循环时解决这个问题?使用集合和批量插入可以工作,但我想使用for循环。

1 个答案:

答案 0 :(得分:6)

您的问题不在于您是在尝试在循环中向def arp_handler(pkt): """ Handles sniffed ARP requests """ for layer in [ARP]: if pkt.haslayer(layer): if pkt[layer].op == 1: #who-has request mac = pkt[layer].hwsrc # your code to handle def main(): sniff(prn=arp_handler, filter="arp", store=0) 添加元素,而是您正在修改哈希地图尝试访问您的HashMap循环的范围。

由于您在hmap上有可变借用,因此不允许您将其元素推送到循环中的hmap向量。向attendees添加值可能需要hashmap重新分配自身,这将使对其中的值的任何引用无效。

解决问题的一个简单方法是:

HashMap

在此代码中,您在填充之后访问的散列图,以填充fn main() { let meeting_one_email = ["email1", "email2", "email1"]; let mut hmap: HashMap<String, String> = HashMap::new(); for m in meeting_one_email.iter() { set_if_needed_and_get(&mut hmap, m.to_string()); } let attendees: Vec<&String> = hmap.keys().collect(); } 向量。