所以我正在创建一个解析器来解析客户工程师制作的一些配置文件。我并不特别信任我们的客户工程师。他们通常可以拼写正确的东西,但他们永远不会记住要利用什么。这使得Enum
类有点吵闹,因为如果他们不输入正确的字符串,Enum
会失败,导致程序中断。
这是我的枚举类:
object EnumLayoutAlignment extends Enumeration
{
type Alignment = Value
val Vertical = Value("Vertical")
val Horizontal = Value("Horizontal")
}
我有没有办法让它成为"垂直","垂直"和"垂直"所有映射到相同的枚举值?
编辑:@Radai在输入上提出了一个很好的点.upper()但我还想包括" vert"和其他类似的输入我使用this作为示例
答案 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”等获得。