在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的任何问题。我可以通过将其转换为两个循环来解决此问题,但这似乎并不是解决此问题的好方法。那么,我该如何解决呢?