Scala 在枚举上匹配 int

Scala match int on enumeration

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 的 id 为 2。

现在如果我这样匹配:

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

symbol id cannot be resolved.

这是为什么?

如果我手动添加 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 => ...
    ...
}

如果您使用 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
}