我有一个元素的向量,我遍历并检查一些属性(不可变)。在某些情况下,我将对该向量中的单个项目执行一个可变操作,然后对容器进行更新。我应该如何做呢?
struct A {
buffer: Vec<B>,
}
impl A {
fn update(&self) {}
}
struct B {}
impl B {
fn check(&self) -> bool { true }
fn do_stuff(&mut self) {}
}
fn main() {
let mut a = A { buffer: vec![B{}] };
for b in a.buffer.iter_mut() { // mutable borrow occurs here
if b.check() {
b.do_stuff();
a.update(); // imutable borrow occurs here
}
}
}
或者,如果我选择一个不可变的 iter()
. 是否有可能将它变成可变的范围,以满足 do_stuff
?
请注意,根据你的使用情况,编译器可能会阻止你出现一个错误。这到底是 "借贷检查器碍事 "还是 "借贷检查器把你从错误中拯救出来",这在很大程度上取决于你实际上打算在 update
方法。
以其当前的签名,该方法可以对以下内容进行任何数量的操作。Vec
这可能会触发其重新分配。甚至交换整个 Vec
为另一个。这两种方法都会使你在缓冲区上的迭代器无效。
值得称赞的是,你尽量避免使用索引。如果你在这里出现了逻辑错误,你要做的就是将编译时的错误换成运行时的错误(也许是一个出界访问),这可以说是更难发现或调试。