Проблемы с Rust Enum - PullRequest
       25

Проблемы с Rust Enum

0 голосов
/ 11 января 2020

Я не могу заставить свое выражение соответствия работать. Глядя на это, это похоже на другие примеры, на которые я смотрел.

fn draw(board: BoardType) {
    let board = match board{
        BoardType::B3x3(board, _) => board,
        BoardType::B4x4(board, _) => board
    };
}

#[derive(Debug)]
enum BoardType {
    B3x3([[Space; 3]; 3], (i8, i8)),
    B4x4([[Space; 4]; 4], (i8, i8)),
}

#[derive(Copy, Clone, Debug)]
enum Space {
    Blank,
    X,
    O,
    Blocked,
}
BoardType::B4x4(board,_) => board
                            ^^^^^ expected an array with a fixed size of 3 elements, found one with 4 elements

Я не очень понимаю, почему это не работает.

1 Ответ

2 голосов
/ 11 января 2020

match выражения возвращают значение. Даже если вы не используете это значение в этом коде, компилятору необходимо проверить тип выражения. Однако две ветви выражения имеют разные типы: [[Space; 3]; 3] и [[Space; 4]; 4] соответственно.

Сообщение об ошибке говорит о том, что вторая ветвь имеет тот же тип, что и первая.

Часть вашей проблемы, вероятно, состоит в том, что ваш код слишком прост и фактически ничего не делает. Предположим, у вас есть функции для рисования этих досок:

fn draw_3x3(board: [[Space; 3]; 3]) {
    unimplemented!()
}

fn draw_4x4(board: [[Space; 4]; 4]) {
    unimplemented!()
}

Затем, когда вы их используете, обе ветви будут иметь одинаковый тип (()), поэтому все выражение будет проверять тип:

fn draw(board: BoardType) {
    let board = match board{
        BoardType::B3x3(board, _) => draw_3x3(board),
        BoardType::B4x4(board, _) => draw_4x4(board),
    };
}
...