Loops 锈借检查看起来很聪明,它可以检查和平读写的循环。但我怎么能绕过它呢?

Loops 锈借检查看起来很聪明,它可以检查和平读写的循环。但我怎么能绕过它呢?,loops,rust,break,borrow,Loops,Rust,Break,Borrow,锈借检查看起来很聪明,它可以检查和平读写的循环。但我怎么能绕过它呢 以下代码运行良好: fn main() { let mut lines = [ vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9], ]; for i in 0 .. lines.len() { let line = &lines[i]; for item in line {

锈借检查看起来很聪明,它可以检查和平读写的循环。但我怎么能绕过它呢

以下代码运行良好:

fn main() {

    let mut lines = [
        vec![1, 2, 3],
        vec![4, 5, 6],
        vec![7, 8, 9],
    ];

    for i in 0 .. lines.len() {
        let line = &lines[i];
        for item in line {
            // if found odd number, push zero!
            if item % 2 == 1 {
                lines[i].push(0);
                break; // works fine! if comment it, will error!
            }
        }
    }

    dbg!(lines);
}
在注释“中断”行时,将得到:

error[E0502]: cannot borrow `lines[_]` as mutable because it is also borrowed as immutable
  --> src/main.rs:13:17
   |
10 |         let line = &lines[i];
   |                    --------- immutable borrow occurs here
11 |         for &item in line {
   |                      ---- immutable borrow later used here
12 |             if item == 5 {
13 |                 lines[1].push(55);
   |                 ^^^^^^^^^^^^^^^^^ mutable borrow occurs here

error: aborting due to previous error

你不能绕过借阅检查器。你考虑它告诉你什么,重新考虑你的程序匹配。

在这里,它告诉您不能修改当前正在迭代的内容(r^w原则),所以不要这样做。如果您想在每一行中添加奇数,那么可以这样做:计算该行中的赔率,然后添加那么多的零:

使用std::iter::repeat;
fn main(){
设mut行=[
vec![1,2,3],
vec![4,5,6],
vec![7,8,9],
];
对于行中的行。iter_mut(){
让赔率=line.iter().filter(| it |*it%2==0.count();
线。延伸(重复(0)。采取(赔率));
}
dbg!(行);
}

您不能绕过借用检查器。你考虑它告诉你什么,重新考虑你的程序匹配。

在这里,它告诉您不能修改当前正在迭代的内容(r^w原则),所以不要这样做。如果您想在每一行中添加奇数,那么可以这样做:计算该行中的赔率,然后添加那么多的零:

使用std::iter::repeat;
fn main(){
设mut行=[
vec![1,2,3],
vec![4,5,6],
vec![7,8,9],
];
对于行中的行。iter_mut(){
让赔率=line.iter().filter(| it |*it%2==0.count();
线。延伸(重复(0)。采取(赔率));
}
dbg!(行);
}

但是,如何修改另一行(不是iter_mut()行)?那么您不能使用迭代,需要使用
split_mut
以便同时在不同行上获得可变引用。或者使用
RefCell
作为数组的项类型,这将允许您可变地借用当前迭代以外的向量。但是,如何修改另一行(不是iter_mut()行)?那么您不能使用迭代,并且需要使用
split_mut
,以便同时在不同的行上获取可变引用。或者使用
RefCell
作为数组的项类型,这将允许您可变地借用当前正在迭代的向量以外的向量。如果可以绕过它,您将遇到借用检查器所要防止的错误:推入向量可能会使其所有引用无效,这意味着您在推入之后无法再遍历它。这是C++中的UB,在Python、C和许多其他语言中抛出了一个异常。很高兴Rust在编译时发现了这一点。如果你能绕过它,你就会碰到借用检查器要防止的错误:推入向量可能会使它的所有引用无效,这意味着在推入之后你不能再遍历它了。这是C++中的UB,在Python、C和许多其他语言中抛出了一个异常。很高兴Rust在编译时发现了这一点。