Как написать функцию, которая принимает только один вариант перечисления в качестве входных данных - PullRequest
0 голосов
/ 02 июня 2019

У меня есть перечисление:

enum Group {
    OfTwo { first: usize, second: usize },
    OfThree { one: usize, two: usize, three: usize },
}

и я хотел бы написать функцию, которая принимает в качестве аргумента только вариант Group::OfTwo:

fn proceed_pair(pair: Group::OfTwo) {
}

Но когда я это делаю, я получаю сообщение:

error[E0573]: expected type, found variant

Есть ли способ достичь этого?

1 Ответ

3 голосов
/ 02 июня 2019

Вариантами enum являются значения и все они имеют одинаковый тип - сам enum. Аргумент функции - это переменная данного типа, и тело функции должно быть допустимым для любого значения этого типа. Так что то, что вы хотите сделать, просто не будет работать.

Тем не менее, существует общая схема проектирования перечислений, которая может помочь здесь. То есть использовать отдельный struct для хранения данных для каждого варианта enum. Например:

enum Group {
    OfTwo(OfTwo),
    OfThree(OfThree),
}

struct OfTwo { first: usize, second: usize }
struct OfThree { one: usize, two: usize, three: usize }

fn proceed_pair(pair: OfTwo) {

}

Везде, где вы ранее находились на enum, например:

match group {
    Group::OfTwo { first, second } => {}
    Group::OfThree { first, second, third } => {}
}

Вы бы заменили на:

match group {
    Group::OfTwo(OfTwo { first, second }) => {}
    Group::OfThree(OfThree { first, second, third }) => {}
}
...