一个枚举的多个值

时间:2014-07-29 15:23:00

标签: scala enums enumeration

所以我正在创建一个解析器来解析客户工程师制作的一些配置文件。我并不特别信任我们的客户工程师。他们通常可以拼写正确的东西,但他们永远不会记住要利用什么。这使得Enum类有点吵闹,因为如果他们不输入正确的字符串,Enum会失败,导致程序中断。

这是我的枚举类:

object EnumLayoutAlignment extends Enumeration
{
     type Alignment = Value
     val Vertical = Value("Vertical")
     val Horizontal = Value("Horizontal")
}

我有没有办法让它成为"垂直","垂直"和"垂直"所有映射到相同的枚举值?

编辑:@Radai在输入上提出了一个很好的点.upper()但我还想包括" vert"和其他类似的输入

我使用this作为示例

2 个答案:

答案 0 :(得分:3)

处理此问题的一种方法是提供反序列化的方法:

def fromString(s: String) = s.upper() match {
  case "VERTICAL" | "VERT" | "V" => Some(Vertical)
  case "HORIZONTAL" | "HORIZ" | "H" => Some(Horizontal)
  case => None
}

然后使用它就像:

EnumLayoutAlignment.fromString(someInput).map(doThingWithValidEnum)

答案 1 :(得分:0)

您可以将这样的方法添加到Enumeration

def tryAsHardAsPossibleToFindMatch(s: String) = {
  val ls = s.toLowerCase
  val fv = values.filter(_.toString.toLowerCase.startsWith(ls))
  fv.size match {
    case 1 => fv.head
    case 0 => sys.error("No matching value for " + s)
    case _ => sys.error("Ambiguous values for " + s)
  }
}

这将允许您使用任何字符串,无论大小写,都是Value开头的一部分。所以Vertical可以通过“VERT”,“vErTi”,“vERTICAL”,“VerticaL”等获得。