gpt4 book ai didi

struct - 遍历struct Hashmap并将值添加到self的另一部分

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

目前,我有一个结构类似于以下内容的结构:

struct foo {
pending: HashMap<K, V>,
loaded: Vec<V>,
}
我正在尝试编写一个函数,该函数将所有未决的哈希图值加载到已加载的状态,同时如果不符合特定条件的值从未决的值中删除,这就是我现在得到的:
pub async fn load(&mut self) {
let mut rm_vector = Vec::new();
for (key, value) in self.pending.iter_mut() {
self.add_to_loaded(value).await.unwrap_or_else( |err| {
if err == Error::SomeError {
rm_vector.push(key.clone())
}
})
}

for value in rm_vector {
self.pending.remove(&value);
}
}
我遇到的问题是,在调用第一个for循环和紧随其后的if语句时,我遇到了第二个可变借用错误。我想知道是否有人对如何解决此问题而不克隆整个哈希图有任何建议。

最佳答案

我使用以下简化代码来复制问题。

use std::collections::HashMap;

struct Foo {
pending: HashMap<String, u32>,
loaded: Vec<u32>,
}

impl Foo {
fn add_to_loaded(&mut self, v: u32) {
self.loaded.push(v);
}
}

impl Foo {
pub fn load(&mut self) {
for _ in self.pending.iter_mut() {
self.add_to_loaded(30);
}
}
}
我认为的原因是iter_mut()和add_to_loaded(&mut)都试图使自己借入变量可变。
我可以想到两种解决该问题的方法。
选项A:
声明作为RefCell 加载的字段。使用它,可以将add_to_loaded的第一个参数声明为self的不可变引用,并使用iter()而不是iter_mut()来迭代HashMap。 for语句中将不会有任何可借用的借方。在add_to_loaded中,使用rowe_mut()获取可变的引用来修改已加载的字段。
use std::collections::HashMap;
use std::cell::RefCell;

struct Foo {
pending: HashMap<String, u32>,
loaded: RefCell<Vec<u32>>,
}

impl Foo {
fn add_to_loaded(&self, v: u32) {
self.loaded.borrow_mut().push(v);
}
}
impl Foo {
pub fn load(&mut self) {
for _ in self.pending.iter() {
self.add_to_loaded(30);
}
}
}
选项B:
将两个字段和两个方法拆分为两个结构。
use std::collections::HashMap;

struct Foo {
pending: HashMap<String, u32>,
}

struct Foo2 {
loaded: Vec<u32>,
}

impl Foo {
pub fn load(&mut self, f: &mut Foo2) {
for _ in self.pending.iter() {
f.add_to_loaded(30);
}
}
}

impl Foo2 {
fn add_to_loaded(&mut self, v: u32) {
self.loaded.push(v);
}
}

关于struct - 遍历struct Hashmap并将值添加到self的另一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62746654/

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