Контекст
- Объект движется в одном направлении: Вверх, вправо, вниз, влево .
- Следующее направление будет выбрано случайным образом.
- Следующее возможное направление не может быть задом наперед.
Пример:
Если оно идет Вправо , может go Вверх, вправо или Вниз , но не Влево.
Enum
Существует простое перечисление для указаний:
#[derive(Debug, PartialEq)]
enum Direction {
Up,
Right,
Down,
Left,
}
Сигнатура функции
Я бы сказал, что это сигнатура функции, которая выполняет задачу:
fn next_direction(current_dir: Direction) -> Direction
Текущая реализация
Это моя текущая реализация:
use rand::prelude::*;
fn next_direction(current_dir: Direction) -> Direction {
let mut rng = thread_rng();
// Possible next direction
let next_dir_iter = [
Direction::Up,
Direction::Down,
Direction::Left,
Direction::Right,
]
.iter()
.filter(|&dir| match (current_dir, dir) {
(Direction::Up, Direction::Down) => false,
(Direction::Down, Direction::Up) => false,
(Direction::Left, Direction::Right) => false,
(Direction::Right, Direction::Left) => false,
(_, _) => true,
});
// Choose one
let dir = next_dir_iter.choose(&mut rng).unwrap();
// Return Direction instead of &Direction
match dir {
Direction::Up => Direction::Up,
Direction::Down => Direction::Down,
Direction::Left => Direction::Left,
Direction::Right => Direction::Right,
}
}
Вопрос
Может ли эта функция быть написана яснее, проще, эффективнее? ?
Я бы сказал, что удобочитаемость - это плюс, поэтому реализация кода с одним вкладышем или кодом не может быть оптимальной.
Я уже нашел этот связанный вопрос: Как Я выбираю случайное значение из перечисления? .
Спасибо =)