Проверка заимствования ржавчины выглядит очень умно, она может проверять и плоские чтения и записи l oop. но как я могу это обойти? - PullRequest
0 голосов
/ 07 мая 2020

Проверка заимствований ржавчины выглядит очень умно, она может проверять и плоские чтения и записи l oop. но как я могу его обойти?

Хорошо работает следующий код:

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);
}

При прокомментировании строки «break» будет получено:

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

1 Ответ

2 голосов
/ 07 мая 2020

Вы не обойдете проверку заемщиков. Вы учитываете то, что он говорит вам, и пересматриваете свою программу, чтобы соответствовать.

Здесь говорится, что вы не можете изменить то, что вы в настоящее время повторяете (принцип r ^ w), поэтому не делайте этого. Если вы хотите добавить столько нулей, сколько нечетных чисел в каждой строке, сделайте это: подсчитайте количество шансов в строке, а затем добавьте это количество нулей:

use std::iter::repeat;

fn main() {

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

    for line in lines.iter_mut() {
        let odds = line.iter().filter(|it| *it % 2 == 0).count();
        line.extend(repeat(0).take(odds));
    }

    dbg!(lines);
}
...