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

rap-2-h

我有一个Elements数组,我想遍历它做一些事情,然后遍历循环Element内的所有s做某事。元素之间存在关系,因此我想遍历所有其他元素以进行检查。出于某些原因,这些元素是可变的引用。有点宽泛,但是我想变得笼统(也许我不应该)。

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);
        }
    }
}

不出所料,我收到此错误:

error[E0499]: cannot borrow `elements` as mutable more than once at a time
  --> src/main.rs:13:18
   |
10 |     for e in &mut elements {
   |              -------------
   |              |
   |              first mutable borrow occurs here
   |              first borrow later used here
...
13 |         for f in &mut elements {
   |                  ^^^^^^^^^^^^^ second mutable borrow occurs here

我知道这是Rust中的正常行为,但是如何避免这种错误的推荐方法是什么?我应该先复制元素吗?忘记循环并以其他方式进行迭代?了解代码设计?

有生锈的方法吗?

oli_obk

您可以使用索引迭代,而不是使用迭代器进行迭代。然后,在内部循环内,您可以使用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);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在另一个Map Java中迭代一个Map

在Python中,如何在一个迭代器上进行迭代,然后在另一个迭代器上进行迭代?

如何在另一个元素之后添加一个元素?

如何迭代HTML <div>元素的数组并为每个索引号不同地设置另一个元素的样式?

在迭代另一个不可变字段的同时对一个字段进行突变

如何从另一个方法中迭代的列表中删除元素?

对特定索引处的嵌套列表的元素以及另一个普通列表的元素的索引进行迭代

如何在包含相同元素的另一个列表中找到一个列表的元素索引?

迭代器:将最后一个元素与另一个值配对

迭代Python列表并根据另一个列表过滤元素

如何在另一个元素下面显示一个元素?

如何使迭代器指向与C ++集合中的另一个元素相同的元素?

如何在HtmlAgilityPack中按类获取另一个元素内的元素

如何在Racket中创建一个列表,使其可以按照添加元素的相同顺序进行迭代?

如何在另一个列表内的列表中添加元素?

如何在另一个flex元素内的flex元素中修复标头

如何在C ++中将可变参数函数与另一个函数消除歧义

如何在另一个 .swift 文件中调用可变属性?

Laravel 访问另一个迭代器中的集合元素

如何选择另一个元素内的元素?

将列表的元素附加到迭代器的左侧或右侧到另一个列表

如何在单击在 vanilla JavaScript 中共享相同类的另一个元素时隐藏元素?

如何在单击另一个元素时关闭一个元素

如何在悬停另一个元素时更改一个元素的颜色?

取一个列表的迭代元素并将其附加到另一个列表

c++ - 如何定义指向另一个容器中元素的迭代器的值类型

如何查看一个元素是否在另一个元素内

如何检查一个迭代中的哪些元素也在另一个中?

迭代一个向量并根据元素创建另一个向量