所以我正在创建一个解析器来解析由我们的客户工程师制作的一些配置文件。我不太信任我们的客户工程师。他们通常能拼写正确,但他们永远记不住要大写什么。这使得Enum
类有点烦人,因为如果它们没有输入正确的字符串,它们会导致Enum
失败,从而破坏程序。
这是我的Enum类:
object EnumLayoutAlignment extends Enumeration
{
type Alignment = Value
val Vertical = Value("Vertical")
val Horizontal = Value("Horizontal")
}
是否有一种方法可以使"垂直","垂直"one_answers"垂直"都映射到相同的枚举值?
编辑:@Radai提出了一个很好的观点,在输入上只使用。upper(),但我也想包括"vert"和其他类似的输入
我用这个作为例子
处理这个问题的一种方法是提供一个反序列化的方法:
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)
你可以添加这样一个方法到你的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"等来获得