如何在自己和容器变异的容器中存储和检索对象

时间:2019-02-14 07:59:34

标签: rust

我有一些对象被构造,存储在单个数据结构中,并在运行二进制文件时进行更新。有时他们变得孤独,需要朋友,因此他们需要能够搜索存储空间,找到朋友,记住朋友的身份并告诉朋友他们是谁。

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

如何构造该代码,以便可以从存储中获取对某个对象的引用,然后允许它对其自身,其同胞以及包含它们的数据结构进行变异?

编辑:我不确定这是否是“如何将两个可变引用放入容器中”这个问题的重复。这就是“如果容器内的对象也需要能够对其容器进行变异,那么该对象如何进行自我变异?”。抱歉,如果不清楚。

0 个答案:

没有答案