在Rust中迭代可变借位时访问方法

qoefvg9y  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(116)

我在下面的代码中迭代了一个Vecself.regions),并在适当的条件下,对Vec的当前元素进行了变异
但是,在处理一个region时,我还必须调用self上借用它的另一个方法,导致我同时拥有self的可变引用和共享引用,这显然是不可能的(而且不会编译)
如何更改代码以使其正常工作?
我曾想过将第3行移到循环之外,并使用iter()代替iter_mut(),但是我不知道如何“保持两个迭代器同步”,以确保两段代码引用同一个区域

fn growth(&'a mut self) {
   for region in self.regions.iter_mut() {
       let candidates = self.neighbors(region); // Has to involve taking a &self
       // Do stuff with `candidates` that involves mutating `region`
   }
}

编辑

我的帖子缺少上下文,所以这里是完整的函数。self.regions的类型是Vec<Vec<&'a Cell>>neighbors的签名是fn neighbors(&self, region: &Vec<&Cell>) -> HashSet<&Cell>
我的程序的目标是将一个网格镶嵌成随机的多联骨牌,方法是随机选择一些源,然后(我发布的部分)通过迭代每个区域并将该区域的随机邻居添加到该区域本身来将它们“生长”成区域。
neighbors函数依赖于先前迭代的结果,因此无法预先计算

fn growth(&'a mut self) -> bool {
        let mut unchoosen_cells = 20; // More complex in reality
        let mut steps: usize = 0;

        while unchoosen_cells != 0 {
            if steps > GROWTH_STEP_LIMIT { return false; }
            for region in self.regions.iter_mut() {
                if rand::random() { continue; }

                let candidates = self.neighbors(region);
                if let Some(cell) = candidates.iter().choose(&mut thread_rng()) {
                    // cell.in_region = true;
                    region.push(cell);
                    unchoosen_cells -= 1;
                }
                steps += 1;
            }
        }
        true
    }
eagi6jfj

eagi6jfj1#

在阅读了所有的评论之后,我明白了我的问题是糟糕的设计造成的,我将重构我的代码以便使用索引而不是引用
感谢所有花时间帮助我的人,我将此标记为已解决

相关问题