【问题标题】:Can I use enums as value checker for another enum?我可以使用枚举作为另一个枚举的值检查器吗?
【发布时间】:2018-12-11 14:00:22
【问题描述】:

我有一个可能的子类别值列表,以及一个需要关联的子类别分组值列表。用户将输入一个子类别值(这必须是整数吗?)我需要检查这个值是否在枚举中,但如果不是,不知道该怎么办。

  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;

我认为我错过了一些非常基本的东西。我不知道枚举是否可行。

【问题讨论】:

  • 我真的会推荐你阅读the book,尤其是关于enums的章节
  • 我不知道你想问什么。你有read The Rust Programming Language吗?它解释了基本概念,例如带有值的枚举的适当语法:Grouping::Exp(Subtypes::acost)
  • Idiomatic Rust 使用snake_case 表示变量、方法、宏和字段; UpperCamelCase 用于类型和枚举变体; SCREAMING_SNAKE_CASE 用于静态和常量。请改用Acost / Bcost
  • 不知道应该怎么做——这不是我们可以帮你的。决定如何处理错误与您的特定程序和任何潜在用户密切相关。
  • 事实上,枚举 Grouping::Exp 指的是多个值——这是什么意思?一个变量一次只能是一个特定的值,而不是多个的“量子叠加”。

标签: enums rust


【解决方案1】:

枚举是对的,您可以在枚举中嵌入额外的数据。我认为您将需要遵循类似的模式。

这里有一些帮助解释的代码,取自 GitHub 存储库。首先,我们在枚举中嵌入一个结构体:

struct ConsoleOutput {}

pub enum OutputTypes {
    Console(ConsoleOutput),
}

这还不足以使它可用;首先,需要一个工厂。工厂实际上分配了嵌入在枚举中的结构:

pub struct OutputFactory {}

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

实际的实现要复杂一些。

之后,在枚举上实现一个 trait,该 trait 包含逻辑。我认为这是您需要工作的领域。

pub struct ShellTypes {}

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

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

【讨论】:

  • 取自 GitHub 存储库 — 如果您从其他来源复制代码,您至少可以链接到它。
  • return ShellTypes — 这不是惯用语;不需要return。也不需要*self 中的*
猜你喜欢
  • 2017-04-01
  • 2019-01-29
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多