Scala 在枚举上匹配 int

标签 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 的 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/

相关文章:

Scala Spark : Access value in a struct in an array-typed column?(或者,访问匿名结构类型列的成员)

scala - 如何让 Scala ToolBox 查看 REPL 定义?

java - Scala 遗传算法 (GA) 库中的模拟二进制交叉 (SBX) 交叉运算符

java - 在 java 中将 "aa"与 "aaaa"匹配会返回 2——我希望它是 3

types - 如何将元组解构为类型变量?

algorithm - 使用 Haskell 进行最近邻和模式识别

java - 玩!框架 : define a variable in template?

java - 下拉列表的变化取决于另一个下拉列表

c# - 在 C# 中扩展枚举

c++ - 是否有任何操纵器可以将枚举值打印为字符串?