Rust-内部包含所有者的mut ref的迭代器

Rust-内部包含所有者的mut ref的迭代器,rust,iterator,mutability,Rust,Iterator,Mutability,我很难使用迭代器,迭代器也会改变其所有者的其他字段 我重新创建了一个简化的示例: #[派生(PartialEq)] 枚举资源枚举{ 食物, } 结构资源{ r#类型:ResourceEnum, 金额:u32, } 特色建筑{ fn生产(和自)->选项; } 结构场{} 结构城市{ 建筑物:Vec, 资源:Vec, } impl城市{ fn添加资源(&mut self,received:Option){ 如果让一些人(已收到)=已收到{ 如果让一些(多个)=自我 .资源 .iter_mut() .

我很难使用迭代器,迭代器也会改变其所有者的其他字段

我重新创建了一个简化的示例:

#[派生(PartialEq)]
枚举资源枚举{
食物,
}
结构资源{
r#类型:ResourceEnum,
金额:u32,
}
特色建筑{
fn生产(和自)->选项;
}
结构场{}
结构城市{
建筑物:Vec,
资源:Vec,
}
impl城市{
fn添加资源(&mut self,received:Option){
如果让一些人(已收到)=已收到{
如果让一些(多个)=自我
.资源
.iter_mut()
.find(| r | r.r#type==received.r#type)
{
res.amount+=已收金额;
}否则{
self.resources.push(已接收);
}
}
}
}
农场综合大楼{
fn生产(自身)->选项{
一些(资源){
r#类型:ResourceEnum::食品,
金额:10,
})
}
}
fn main(){
让mut city=城市{
建筑物:vec![],
资源:vec![],
};
城市。建筑物。国际热核实验堆()。每个(| f |{
城市。添加_资源(f.product());
});
}
错误:

error[E0502]:无法将'city'作为可变项借用,因为它也是作为不可变项借用的
-->src/main.rs:55:36
|
53 | city.buildings.iter()。各| f |{
|------------------------------^^^^可变借用发生在此处
|     |                     |
||不可变借阅稍后由调用使用
|不可变借用发生在这里
54 |城市。添加|资源(f.农产品());
|----第二次借用是由于在关闭时使用了“city”
我试图实现的是拥有一个单一的结构来容纳我的“世界”->城市,它容纳像农场这样的建筑和所有可用的资源,比如食物

在每次州更新时,我都想计算所有农场的收成,等等……并将生产的资源添加到城市存储中,但我想不出一种方法,不将所有生产存储为一个单独的向量,并再次迭代,将其添加到城市存储中,这似乎是多余的


我想我很难找到更好的方法来设计我的世界结构,但我想不出任何东西。

当然,我能做的是将资源的生产分离出来,并将其添加到城市中。我已经修改了您的,以便将其编译:

let mut v:Vec<Option<ResourceEnum>> = city.buildings.iter().map(|f| f.produce()).collect();
v.drain(..).for_each(|r| city.add_resource(r));
let mut v:Vec=city.buildings.iter().map(|f | f.product()).collect();
v、 排水管(..)。对于每个城市(| r |城市。添加|U资源(r));

但是,当你在同一个对象内的建筑上迭代时,你当然不能调用城市上的可变函数。

TL;DR:你不能这样做,“我想我很难找到更好的方法来设计我的世界结构,但想不出任何东西。”这回答了你的问题吗?为了给你一个更精确的答案,你需要给出一个更精确的用例,你的用例是不完整的,应该是
add_ressource()
?。我已经填充了add_资源:它将生成的资源添加到一个存储中,该存储包含每个ResourceEnum类型和相关金额。我建议您不要对每个()使用
迭代器中没有副作用。代码的重复解决方案。顺便说一句,你应该使用hashmap作为你的资源,甚至直接放置它们。这样更好……这是hashmap的好提示,非常感谢,再见。啊,似乎不可避免地要先收集它。/谢谢,我不确定我是错过了什么,还是真的错过了试图做不可能的事。