【发布时间】:2020-07-05 21:43:49
【问题描述】:
目前我有一个类似于以下的结构:
struct foo {
pending: HashMap<K, V>,
loaded: Vec<V>,
}
我正在尝试编写一个函数,它将所有待处理的 hashmap 值加载到已加载中,同时如果它们不符合特定标准,则从待处理中删除任何值,这就是我现在所拥有的:
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 语句时,我遇到了第二个可变借用错误。我想知道是否有人对如何在不克隆整个哈希图的情况下解决此问题有任何建议。
【问题讨论】:
-
您能否发布实际代码(相关部分)。您粘贴的代码很难按原样遵循。我看到您有
.await调用,但函数本身不是async函数,也不是在async块中运行。您是否正在尝试为您的 Struct 实现 Future 特征? -
啊我忘了在函数声明中添加异步。基本上 add_to_loaded 将给定的值添加到加载中,如果不满足某个标准,则抛出 SomeError 并且不添加到加载中。我没有包含 add_to_loaded 因为该函数大约有 100 行,所以只包含函数调用更有意义。
-
add_to_loaded有&mut self参数吗? -
@Kitsu 是的,它有 &mut self 和 value 作为参数
-
我无法重现您的问题。您能否添加函数
add_to_loaded、Error类型以及最重要的是确切的错误消息?