Могу ли я использовать перечисления в качестве проверки значения для другого перечисления? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть список возможных значений подкатегорий, а также список значений группировки подкатегорий, которые необходимо связать.Пользователь введет значение подкатегории (Должно ли это быть целое число?). Мне нужно проверить, есть ли это значение в перечислении, но не знаю, что делать, если это не так.

  1. Есть ли "автоматический" способ сделать эту проверку?Должны ли мы делать это программно, выполняя тест перечисления?
  2. Если подкатегория используется в категории группировки, как ее можно использовать?Как это можно установить, как это можно прочитать?

Я думаю, что отношения перечислений будут примерно такими:

#[derive(Debug)]
pub enum Subtypes {
    acost,
    bcost,
    //... other subtypes
}

#[derive(Debug)]
pub enum Grouping {
    Exp(Subtypes),
    //...other grouping associated with different subtypes
}

Как определить новыйпеременная, основанная на перечислении группировки, и как к нему можно получить доступ?

// this doesn't work!!
let group = Grouping::Exp;

Я думаю, что мне не хватает чего-то действительно фундаментального.Я не знаю, подходят ли перечисления.

1 Ответ

0 голосов
/ 11 декабря 2018

Вы правы с перечислениями, вы можете встраивать дополнительные данные в перечисление.Я думаю, вам нужно будет следовать аналогичной схеме.

Вот некоторый код, помогающий объяснить, взятый из репозитория GitHub.Сначала мы встраиваем структуру в перечисление:

struct ConsoleOutput {}

pub enum OutputTypes {
    Console(ConsoleOutput),
}

Этого недостаточно, чтобы сделать его пригодным для использования;для начала нужна фабрика.Фабрика фактически выделяет структуру, которая встроена в перечисление:

pub struct OutputFactory {}

impl OutputFactory {
    pub fn get() -> OutputTypes {
        OutputTypes::Console(ConsoleOutput {})
    }
}

Фактическая реализация немного сложнее.

После этого признак реализуется в перечислении, и признак содержит логику.Я думаю, что это та область, в которой вам нужно работать.

pub struct ShellTypes {}

pub trait OutputTrait {
    fn generate(&self) -> ShellTypes;
}

impl OutputTrait for OutputTypes {
    fn generate(&self) -> ShellTypes {
        match *self {
            _ => return ShellTypes {},
        }
    }
}
...