Я делаю игру, которая позволяет вам выбирать количество игроков, против которых вы играете; мы используем количество игроков для создания перечисления ходов игроков, по которому затем продвигаемся.
enum MetaGamePhase{
ChoosePlayerCount,
ConfirmLibrary,
ChooseFirstTurn,
InitialDraw,
MulliganChoice,
ActiveGame,
EndGame,
DeclareWinner,
None
}
// need to set the contents of this based on the players choosing the player count
enum Turn{
Player1,
Player2,
Player3,
}
enum Action {
ProgressPlayerTurn
}
fn reducer(mut state: GameState, action: Action) -> GameState {
match action{
Action::ProgressPlayerTurn => GameState{
turn: {
use Turn::*;
// will also need to set this dynamically based on the enum
match state.turn {
Player1 => Player2,
Player2 => Player3,
Player3 => Player1,
}
},
..state
}
}
}
struct GameState{
turn: Turn,
meta_game_phase: MetaGamePhase
}
Как бы я сделал это в ржавчине?
Rust — это не Javascript, в нем есть четкое разделение между временем компиляции и временем выполнения. Создание перечислений может выполняться только во время компиляции, поэтому на него не влияют значения времени выполнения.
В чем преимущество использования такого типа циклического перечисления, а не просто кольцевого буфера или приоритетной очереди, из которой вы можете извлекать и извлекать данные по мере необходимости?
В Rust перечисления представляют собой конструкцию времени компиляции, поэтому вы не можете динамически создавать или изменять перечисления на основе входных данных во время выполнения. но вы можете добиться аналогичной функциональности, используя другие конструкции, такие как векторы или целочисленные значения, для управления динамическими аспектами вашего игрового состояния.
Ответ: вы не можете этого сделать, и вам следует использовать другую языковую функцию.
Перечисления представляют собой конструкцию только времени компиляции. Вместо этого вам следует использовать целочисленное значение для текущего игрока и количества игроков.