Rust 借用self时在HashMap上生锈循环

Rust 借用self时在HashMap上生锈循环,rust,borrow-checker,Rust,Borrow Checker,我有一个元素结构,它实现了一个更新方法,该方法需要一个持续时间。结构包含一个组件向量。允许这些组件在更新时修改元素。我这里有一个借书错误,我不知道该怎么办。我试着用积木把它修好,但积木似乎不能满足借书人的要求 use std::collections::HashMap; use std::time::Duration; pub struct Element { pub id: String, components: HashMap<String, Box<Compo

我有一个
元素
结构,它实现了一个更新方法,该方法需要一个持续时间。结构包含一个组件向量。允许这些组件在更新时修改元素。我这里有一个借书错误,我不知道该怎么办。我试着用积木把它修好,但积木似乎不能满足借书人的要求

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() {}
返回哈希映射中键的迭代器。
clone()
调用仅复制迭代器,而不复制键本身。您最初使用
map
函数的方法看起来很有前途。您可能需要使用以下工具在
Vec
中收集结果:

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

将返回哈希映射中键的迭代器。
clone()
调用仅复制迭代器,而不复制键本身。您最初使用
map
函数的方法看起来很有前途。您可能需要使用以下工具在
Vec
中收集结果:


这样可以确保在开始删除操作之前复制所有密钥。

谢谢您的帮助。这就成功了。非常感谢,我想说首选
self.components.keys().cloned().collect()
。感谢您的帮助。这就成功了。我真的很感激,我想说,
self.components.keys().cloned().collect()
是首选。
let keys = self.components.keys().cloned().collect::<Vec<_>>();
for key in keys {
    self.components.remove(&key).unwrap();
}