Scala在枚举上匹配int

时间:2015-07-24 19:28:40

标签: scala enums pattern-matching

val size: Int = o.getSize

size match
{
    case MyObject.Size.small.id => println("Small")
    case MyObject.Size.medium.id => println("Medium")
    case _ => throw ne UnknownSizeException
}

无法编译,我的IDE中出现了奇怪的错误,但这是因为我正在使用gradle和许多遗留Java代码我要逐步更新。

我仍然不确定,为什么这不起作用。 Small的id为1,Medium为2。

现在,如果我这样匹配:

  case s: MyObject.Size.small.id => println("Small")
  

符号ID无法解析。

为什么?

如果我手动添加1和2,一切都像魅力一样。

修改

我认为一个问题是.id从零开始,而我的大小从1开始(这里有意义,因为它是实际大小)

但仅此一点不可能是问题,可以吗?因为我无论如何都要与_匹配。

但我怎么能克服这个?

case MyObject.Size.small.id + 1 => println("Won't work!")

编辑:我的实际解决方案,感谢Sascha Kolberg

MyObject.Size(size+1) match
{
    case MyObject.Size.SMALL => ...
    ...
}

1 个答案:

答案 0 :(得分:5)

如果您使用Enumeration,则Enumeration.Value.id无法匹配,因为它是def,对于模式匹配,您需要稳定的标识符,这基本上意味着val

您在枚举值上匹配,请尝试以下操作:

MyObject.Size(size) match
{
  case MyObject.Size.small => println("Small")
  case MyObject.Size.medium => println("Medium")
  case _ => throw new UnknownSizeException
}