如何在相同元素上迭代另一个可变迭代中的可变元素?

rap*_*2-h 4 rust borrow-checker

我有一个Elements 数组,我想迭代它来做一些事情,然后遍历循环中的所有Elements来做一些事情.元素之间存在关系,所以我想迭代到所有其他元素来检查一些东西.这些元素是可变引用的原因.它有点宽泛,但我想成为一般(也许我不应该).

struct Element;

impl Element {
    fn do_something(&self, _e: &Element) {}
}

fn main() {
    let mut elements = [Element, Element, Element, Element];

    for e in &mut elements {
        // Do stuff...

        for f in &mut elements {
            e.do_something(f);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如所料,我收到了这个错误:

不能Element一次多次借用可变的东西

我知道这是Rust中的正常行为,但是建议的方法是什么来避免这个错误?我应该先复制元素吗?忘记循环并以不同的方式迭代?了解代码设计?

有生锈的方法吗?

免责声明:我知道这是一个常见的错误,可能会在别处回答,但我又一次失败了.我没有找到相关的答案,也许我不知道如何搜索.对不起,如果它是重复的.

oli*_*obk 6

您可以使用索引迭代而不是迭代迭代器.然后,在内部循环内部,您可以使用split_at_mut两个可变引用到同一个切片中.

for i in 0..elements.len() {
    for j in 0..elements.len() {
        let (e, f) = if i < j {
            // `i` is in the left half
            let (left, right) = elements.split_at_mut(j);
            (&mut left[i], &mut right[0])
        } else if i == j {
            // cannot obtain two mutable references to the
            // same element
            continue;
        } else {
            // `i` is in the right half
            let (left, right) = elements.split_at_mut(i);
            (&mut right[0], &mut left[j])
        };
        e.do_something(f);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此解决方案与 OP 的代码略有不同,事实上,永远不会使用相同的两个值来调用“doSomething”。另一个答案描述了原因。 (2认同)