如何缩小可变[重复]的范围?

问题描述 投票:0回答:1

我有一个元素的向量,我遍历并检查一些属性(不可变)。在某些情况下,我将对该向量中的单个项目执行一个可变操作,然后对容器进行更新。我应该如何做呢?

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?

rust immutability borrowing
1个回答
0
投票

请注意,根据你的使用情况,编译器可能会阻止你出现一个错误。这到底是 "借贷检查器碍事 "还是 "借贷检查器把你从错误中拯救出来",这在很大程度上取决于你实际上打算在 update 方法。

以其当前的签名,该方法可以对以下内容进行任何数量的操作。Vec 这可能会触发其重新分配。甚至交换整个 Vec 为另一个。这两种方法都会使你在缓冲区上的迭代器无效。

值得称赞的是,你尽量避免使用索引。如果你在这里出现了逻辑错误,你要做的就是将编译时的错误换成运行时的错误(也许是一个出界访问),这可以说是更难发现或调试。

© www.soinside.com 2019 - 2024. All rights reserved.