Scala匹配/比较枚举

5

我有一个枚举类型,想在Actor中使用它进行模式匹配。但结果不符合我的预期,现在我怀疑可能漏掉了一些简单的东西。

我的枚举类型是,

object Ops extends Enumeration {
  val Create = Value("create")
  val Delete = Value("delete")
}

接着,我从一个字符串创建了一个Ops:

val op = Ops.valueOf("create")

在我的程序中,我有:

case (Ops.Create, ...)

但是Ops.Create似乎并不等于ops.valueOf("create")

前者只是一个原子'create',而后者是Some(create)

希望这足够让有经验的人告诉我我错过了什么...

谢谢

3个回答

7

如果您只是想获得 Create 的副本,则应该在您的代码中直接引用它:

val op = Ops.Create

但是如果你从一个字符串中解析它,字符串可能包含垃圾字符,因此 valueOf 返回一个 Option

val op1 = Ops.valueOf("create")  // Some(Ops.Create)
val op2 = Ops.valueOf("delete")  // Some(Ops.Delete)
val op3 = Ops.valueOf("aljeaw")  // None

现在,在你的匹配中,你只需携带 Option[Ops.Value] 并寻找:
case(Some(Ops.Create),...)

您可以内置强大的防垃圾输入功能。


10
如果有人在将来阅读这篇文章,Enumeration.valueOf 已经被弃用:请使用 withName 替代。 - Luigi Plinge

1

Enumeration.valueOf 返回 None 或者 Some,因为你可能会请求创建一个不存在的值。例如,在你的情况下,Ops.valueOf("blah") 会返回 None,因为你没有适当的枚举值。

说实话,在这种情况下,我会使用 case class 或者 case object 而不是 Enumeration(它们提供更好的类型安全性)。


-1
似乎我需要使用返回的 Some 的 'get' 方法才能获得我想要的东西。例如:
ops.valueOf("create").get == Ops.Create

看起来既不直观也不友好,但它能正常工作。


这是因为 Enumeration.valueOf 返回一个 Option 对象,这意味着你必须使用 get 来获取值。 - mipadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接