Rust double mut 在循环中借用

Rust double mut borrow in loops

正在寻找一种同时推入 Vec> 及其内部 Vec<> 的方法。我明白为什么它会失败,但仍在努力寻找一些优雅的方法来解决它。

fn example() {
    let mut vec: Vec<Vec<i32>> = vec![];
    vec.push(vec![]);
    for i in &mut vec {
        i.push(1);
        if vec.len() < 10 {
            vec.push(vec![]); // second mut borrow
        }
    }
}

借用检查器不允许您通过引用迭代向量并在迭代期间修改它。这样做的原因是修改向量可以重新分配其存储空间,这会使用于迭代的引用无效。 (还有一个问题,迭代一个变化的向量意味着什么,你想访问迭代期间添加的元素还是只访问最初存在的元素。)

允许您执行所需操作的最简单修复方法是使用索引迭代向量:

fn example() {
    let mut vec: Vec<Vec<i32>> = vec![];
    vec.push(vec![]);
    let mut ind = 0;
    while ind < vec.len() {
        let i = &mut vec[ind];
        i.push(1);
        if vec.len() < 10 {
            vec.push(vec![]);
        }
        ind += 1;
    }
}