gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:32:35 25 4
gpt4 key购买 nike

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

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 循环。

最佳答案

你的问题不是你试图在循环中向你的 HashMap 添加元素,而是你正在修改你的 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();
}

在这段代码中,您将访问散列映射之后填充它以填充您的attendees向量。

关于rust - 将条目添加到 HashMap 并在 for 循环中获取对它们的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51055299/

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