Scala:如何根据值和标签获取枚举元素?

Ale*_*lex 3 enumeration scala

我有两个枚举类定义如下。

object Rating extends Enumeration {
  type Rating = Value
  val LOW: Value = Value("Low")
  val AVERAGE: Value = Value("Average")
  val HIGH: Value = Value("High")
}

object Reason extends Enumeration {
  type Reason = Value
  val MISSING_PARTS: Value = Value(1)
  val WRONG_ITEM: Value = Value(2)
  val DEFECTIVE_ITEM: Value = Value(3)
}
Run Code Online (Sandbox Code Playgroud)
  1. 如何根据字符串值“低”、“平均”和“高”获得评级

  2. 如何根据整数值 1、2、3 获取原因

  3. 如何根据 val 名称 MISSING_PARTS、WRONG_ITEM、DEFECTIVE_ITEM 获取原因

如果我没有使用正确的术语,请纠正我。我有 Java 背景,刚接触 Scala。我做了很多搜索,但要么它们已经过时,要么它们使用非常琐碎的示例,其中标签和值是相同的字符串,这没有多大帮助。

任何帮助将不胜感激。

Tza*_*har 5

  1. Rating.withName("Low")
  2. Reason(1)(这是 的简写Reason.apply(1)
  3. Reason.withName("DEFECTIVE_ITEM")

解释:

每个枚举值都有一个 id 和一个名称。两者都是使用默认值生成的,除非您使用适当的Value(...)重载覆盖它们。在本例中,Rating具有自定义名称Reason自定义ID。根据上面的代码,这些是分配给每个值的名称和 ID:

val LOW: Value = Value("Low")         // Id: 0; Name: Low
val AVERAGE: Value = Value("Average") // Id: 1; Name: Average
val HIGH: Value = Value("High")       // Id: 2; Name: High

val MISSING_PARTS: Value = Value(1)   // Id: 1; Name: MISSING_PARTS
val WRONG_ITEM: Value = Value(2)      // Id: 2; Name: WRONG_ITEM
val DEFECTIVE_ITEM: Value = Value(3)  // Id: 3; Name: DEFECTIVE_ITEM
Run Code Online (Sandbox Code Playgroud)

现在,我们可以使用withName(name: String)apply(id: Int)which 分别基于名称和 id 引用值来访问特定值。

  • 1. 我认为一个枚举值不可能有两个名称,所以我想答案是否定的。2. 您可以使用 `.values.find` - 例如 `Rating.values.find(_.id == 5)` 或 `Rating.values.find(_.toString == "wrong")`,它返回一个`选项`。 (2认同)