我有下面这段代码,我迭代Vec
(self.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
}
标题>在阅读了所有的评论后,我明白我的问题是一个糟糕的设计的结果,我将重构我的代码,以便使用索引而不是引用
感谢所有花时间帮助我的人,我将此标记为已解决