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 以 0 开头,而我的大小以 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
}
关于Scala 在枚举上匹配 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31618355/