Задать вопрос
  • Как исправить ошибку used of moved value?

    bingo347
    @bingo347
    Crazy on performance...
    temp = temp.into_iter().rev().collect();
    (0..cols).for_each(|col| vec[row][col] = temp[col]);

    temp владеет некоторой памятью
    (0..cols).for_eachитерирует и вызывает переданную ему функцию cols раз
    замыкание преданное в for_each захватывает vec по &mut ссылке, а temp по значению
    на первой итерации temp[0] делает move в vec[row][0], так как в memory model Rust ни один тип не может существовать в виде "огрызка с дыркой", компилятор дописывает drop(temp) в конец функции |col| vec[row][col] = temp[col], а так как temp захвачен замыканием по значению (по сути он является частью замыкания), то в конце итерации цикла внутри for_each еще и само замыкание дропается.
    Другими словами for_each хочет от вас FnMut, а Вы ему дали только FnOnce.

    Думаю Вам поможет одна из этих функций:
    https://doc.rust-lang.org/beta/std/mem/fn.take.html
    https://doc.rust-lang.org/beta/std/mem/fn.replace.html

    index out of bounds: the len is 2 but the index is 2
    Это не ошибка компиляции, а runtime panic, которая говорит о там, что Вы вышли за границу слайса

    P.S. я надеюсь у Вас усть понимание, что здесь O(n3)?
    while (0..rows).map(|r| vec[r].first().unwrap()).all(|&x| x == 0) {
        (0..rows).for_each(|r| {vec[r].remove(0);});
    };
    Ответ написан
    Комментировать