if backward_direction {
for index in (0..map_len).rev() {
try_change_tile(index);
}
} else {
for index in 0..map_len {
try_change_tile(index);
}
}
Хотелось бы от дублирования цикла избавиться.
Но не получается выделить диапазон в одну переменную в каком-либо виде:
let range = if backward_direction {(0..map_len).rev()} else {(0..map_len)};
пишет что разный тип: expected struct Rev, found struct std::ops::Range
Как бы тут к одному типу свести?
Хм, у меня получилось только через Box, но как-то это не стройно, может у кого будут идеи получше? =) https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=74708ac5d27bd4c4e2fd3ec22eb413e2
Можно к итератору оба свести
к dyn Iterator ?
Ну, как сказали выше, нужна функция высшего порядка (impl Iterator<...>) Можешь просто (map_len - index) на месте делать
А можешь пример накидать на playground с функцией высшего порядка? Не очень понимаю о чём речь
Не могу, неудобно. Должно получиться типа: || -> impl Iterator { x or y } Аналогично можно внутреннюю функцию сделать
с избавлением "дублирования" кода еще больше становится, но можно чуть сократить https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e8c20b4855ecbf242534c3ee8c97d31d
Да, в конечном итоге я к for_each и пришел. В конкретном случае, наверное, оптимальный вариант и плане объема кода и читаемости.
let range = if backward_direction { map_len..0 } else { 0..map_len };
А я я, только вот рейндж с start>end - пуст
вот вафлевский подход без боксов: fn main() { let arr = [0, 1, 2, 3]; let len = arr.len(); let dir = true; // <<< let range: &mut dyn Iterator<Item = usize>; let mut range_forward; let mut range_backward; if dir { range_backward = (0..len).rev(); range = &mut range_backward; } else { range_forward = 0..len; range = &mut range_forward; }; for i in range { dbg!(arr[i]); } }
Обсуждают сегодня