我有一些对象被构造,存储在单个数据结构中,并在运行二进制文件时进行更新。有时他们变得孤独,需要朋友,因此他们需要能够搜索存储空间,找到朋友,记住朋友的身份并告诉朋友他们是谁。
struct Obj {
id: i32,
friend: Option<i32>,
}
impl Obj {
fn find_friend(&mut self, storage: &mut HashMap<i32, Obj>) {
// let's pretend we found this friend in storage
let friend_id = 1;
let new_friend = storage.get_mut(&friend_id).unwrap();
self.friend = Some(new_friend.id);
new_friend.friend = Some(self.id);
}
}
fn main() {
let mut storage: HashMap<i32, Obj> = HashMap::new();
let obj = Obj {
id: 0,
friend: None,
};
let id = obj.id;
storage.insert(id, obj);
// time passes
let obj_again = storage.get_mut(&id).unwrap();
obj_again.find_friend(&mut storage);
}
不幸的是,我与借阅支票打架:
error[E0499]: cannot borrow `storage` as mutable more than once at a time
--> src\main.rs:190:22
|
189 | let obj_again = storage.get_mut(&id).unwrap();
| ------- first mutable borrow occurs here
190 | obj_again.find_friend(&mut storage);
| ^^^^^^^ second mutable borrow occurs here
191 | }
| - first borrow ends here
error: aborting due to previous error
如何构造该代码,以便可以从存储中获取对某个对象的引用,然后允许它对其自身,其同胞以及包含它们的数据结构进行变异?
编辑:我不确定这是否是“如何将两个可变引用放入容器中”这个问题的重复。这就是“如果容器内的对象也需要能够对其容器进行变异,那么该对象如何进行自我变异?”。抱歉,如果不清楚。