如何在Rust中使用可变的迭代器管理所有权

时间:2019-07-12 09:30:11

标签: rust iterator borrowing

在Rust中,我正在尝试这样做:

use std::ops::Index;

#[derive(Debug)]
struct TestChild<'a> {
    name: &'a str,
}

impl<'a> TestChild<'a> {
    fn new(name: &'a str) -> Self {
        Self { name }
    }

    fn add(&mut self) {
        // Some code here
    }
}

#[derive(Debug)]
struct Parent<'a> {
    children: Vec<TestChild<'a>>,
}

impl<'a> Parent<'a> {
    fn new() -> Self {
        let init = TestChild::new("Init child");
        Self {
            children: vec![init],
        }
    }

    fn get_last(&self) -> &TestChild<'a> {
        self.children.index(self.children.len() - 1)
    }

    fn test(&mut self, name: &str) {
        for child in self.children.iter_mut() {
            child.add();

            println!("{:?}", self.get_last());
        }
    }
}

fn main() {
    let mut p = Parent::new();
    p.test("Foo");
    p.test("Bar");
}

但是,我遇到一个错误:

error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
  --> src/main.rs:39:30
   |
36 |         for child in self.children.iter_mut() {
   |                      ------------------------
   |                      |
   |                      mutable borrow occurs here
   |                      mutable borrow later used here
...
39 |             println!("{:?}", self.get_last());
   |                              ^^^^ immutable borrow occurs here

我发现此错误令人困惑,因为我没有在循环内借用self作为不可变的。相反,我是借用TestChild<'a>中的每个self.children作为可变变量。但是Rust似乎认为,通过为self.children获取一个可变的迭代器,可以对self进行突变。我想我可以看到这样的原因:self.children毕竟是self上的一个字段。但是,内部不可变借项是TestChild<'a>,而不可变借项在self上,因此这不会引起IMO的任何问题。我可以通过将其转换为两个循环来解决此问题,但这似乎并不是解决此问题的好方法。那么,我该如何解决呢?

0 个答案:

没有答案