我正在开发一个程序,该程序根据选择的选项使用不同的指令集,目前我正在使用
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
}
有办法做到这一点吗?
一个简单的
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上的完整示例。