@radionnazmiev
Self-taught alien

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

При наведении на row и temp[col] из vec[row][col] = temp[col] выдает Use of moved value который я не могу понять где происходит. Тоже самое и с "r" из vec[r].first()
также компилятор выдает index out of bounds: the len is 2 but the index is 2
'E' => { (0..rows).for_each(|row| {
                    let temp = (0..cols)
                        .rev()
                        .map(|col| vec[row][col])
                        .filter(|&x| x != 0)
                        .collect();
                    let mut temp = tilt_sequence(temp, cols);
                    temp = temp.into_iter().rev().collect();
                    (0..cols).for_each(|col| vec[row][col] = temp[col]);
                });
                    while (0..rows).map(|r| vec[r].first().unwrap()).all(|&x| x == 0) {
                        (0..rows).for_each(|r| {vec[r].remove(0);});
                    };
                },



  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
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);});
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы