如何创建一个结构体来保存枚举的所有变体

问题描述 投票:0回答:1

我正在开发一个程序,该程序根据选择的选项使用不同的指令集,目前我正在使用

choose_instruction_set
功能来选择选择哪个选项。

enum PrintFileLanguage {
    PJL,
    PCL,
    PCL6,
    PS,
}

enum SelectedOption {
    A,
    B,
    C,
}

#[derive(serde::Serialize, serde::Deserialize)]
struct Instructions;


#[derive(serde::Serialize, serde::Deserialize)]
struct AllOptionInstructions {
    a: Instructions,
    b: Instructions,
    c: Instructions,
}

fn choose_instruction_set(option: SelectedOption, all_options: AllOptionInstructions) -> Instructions {
    match option {
        SelectedOption::A => all_options.a,
        SelectedOption::B => all_options.b,
        SelectedOption::C => all_options.c,
    }
}

但是,我更愿意使用枚举变体作为结构的字段名称,以便它们可以直接匹配,即类似

fn test(opt: SelectedOption) -> Instructions {
    Instructions = AllOptionInstructions::opt
}

有办法做到这一点吗?

rust struct enums matching
1个回答
0
投票

一个简单的

HashMap
就可以了。

struct AllOptionInstructions {
    instructions: HashMap<SelectedOption, Instructions>,
}

使用所有选项初始化它:

fn new() -> Self {
    AllOptionInstructions {
        instructions: HashMap::from([
            (SelectedOption::A, Instructions{}),
            (SelectedOption::B, Instructions{}),
            (SelectedOption::C, Instructions{}),
        ]),
    }
}

只需使用查找即可通过枚举键获取值。

fn choose_instruction_set(&self, option: SelectedOption) -> Option<&Instructions> {
    self.instructions.get(&option)
}

Playground上的完整示例。

© www.soinside.com 2019 - 2024. All rights reserved.