gpt4 book ai didi

借用 self 时在 HashMap 上进行 Rust 循环

转载 作者:行者123 更新时间:2023-11-29 08:27:15 39 4
gpt4 key购买 nike

我有一个 Element 结构,它实现了一个更新方法,该方法需要一个滴答持续时间。该结构包含一个组件向量。允许这些组件在更新时修改元素。我在这里遇到借用错误,我不确定该怎么做。我尝试用 block 修复它,但 block 似乎不能满足借用检查器的要求。

use std::collections::HashMap;
use std::time::Duration;

pub struct Element {
pub id: String,
components: HashMap<String, Box<Component>>,
}

pub trait Component {
fn name(&self) -> String;
fn update(&mut self, &mut Element, Duration) {}
}

impl Element {
pub fn update(&mut self, tick: Duration) {
let keys = {
(&mut self.components).keys().clone()
};
for key in keys {
let mut component = self.components.remove(key).unwrap();
component.update(self, Duration::from_millis(0));
}
}
}

fn main() {}

错误

error[E0499]: cannot borrow `self.components` as mutable more than once at a time
--> src/main.rs:20:33
|
17 | (&mut self.components).keys().clone()
| --------------- first mutable borrow occurs here
...
20 | let mut component = self.components.remove(key).unwrap();
| ^^^^^^^^^^^^^^^ second mutable borrow occurs here
...
23 | }
| - first borrow ends here

error[E0499]: cannot borrow `*self` as mutable more than once at a time
--> src/main.rs:21:30
|
17 | (&mut self.components).keys().clone()
| --------------- first mutable borrow occurs here
...
21 | component.update(self, Duration::from_millis(0));
| ^^^^ second mutable borrow occurs here
22 | }
23 | }
| - first borrow ends here

最佳答案

keys() method返回 HashMap 中键的迭代器。 clone() 调用只复制迭代器,而不是键本身。您使用 map 函数的原始方法看起来很有希望。您可能需要使用 collect() method of the iteratorVec 中收集结果:

let keys = self.components.keys().cloned().collect::<Vec<_>>();

然后:

for key in keys {
self.components.remove(&key).unwrap();
}

这确保在删除操作开始之前复制所有 key 。

关于借用 self 时在 HashMap 上进行 Rust 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45311896/

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