我正在尝试在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循环。
答案 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();
}
向量。