scala - 从 Scala 枚举中获取值

标签 scala enumeration

说我有这样的枚举

object SimpleEnum extends Enumeration{
 val ONE = Value(1)
 val TWO = Value(2)
 val THREE = Value(3)
 etc...
}

我也有一个类,我想扩展 Ordered[SimpleEnum]
class SimpleClass(se: SimpleEnum) extends Ordered[SimpleEnum] {
  override def compare(that: SimpleEnum): Int = this.se.[here i want to get instance of SimpleEnum, just like i used to do in java, but unfortunately it's not possible]
}

所以在 SimpleClass 中,我只需要获取附加到相应 SimpleEnum val 的值。

enter image description here

在 java 中,我可以在 enum 上声明一个变量,并通过这个 var 访问与它对应的实际值,在 scala 中,我正在寻找一种方法来获取 enum 的实例并获取其值。

最佳答案

有可能,使用 id方法。

scala> object E extends Enumeration { 
  val A = Value(1)
  val B = Value(7)
  val C = Value(2)
}
defined object E

scala> E.A.id
res7: Int = 1

scala> E.B.id
res8: Int = 7

scala> E.C.id
res9: Int = 2
Enumeration值也可以很容易地比较
scala> E.A < E.B
res10: Boolean = true

scala> E.C < E.B
res11: Boolean = true

scala> E.B < E.A
res12: Boolean = false

引用 documentation更多

编辑

你在图片中的代码是错误的。首先,在您的原始代码中(不在图片中),SimpleEnum应该是 object ,不是 class .一旦您进行更改,您的代码将无法编译,这应该会响起。

你要SimpleClass能够包装您的枚举值。这些值的类型(即 ONETWOTHREE )不是 SimpleEnum ,是SimpleEnum.Value .这种类型的对象有 id方法。
class SimpleClass(se: SimpleEnum.Value) extends Ordered[SimpleEnum.Value] {
  override def compare(that: SimpleEnum.Value): Int = se.id
}

一个常见的做法是为 Value 声明一个类型别名。与枚举对象的名称完全相同。然后你可以导入这个类型并使用它
object SimpleEnum extends Enumeration {
  type SimpleEnum = Value

  val ONE = Value(1)
  val TWO = Value(2)
  val THREE = Value(3)
}

import SimpleEnum.SimpleEnum

class SimpleClass(se: SimpleEnum) extends Ordered[SimpleEnum] {
  override def compare(that: SimpleEnum): Int = se.id
}

请注意 Enumeration#Value已经实现 Ordered[Value] .您可以在我之前链接的文档中验证它。

没有经典的java enum在 scala 中,但由于该语言非常酷,因此可以创建一个名为 Enumeration 的常规类通过一些技巧可以实现类似的行为。

关于scala - 从 Scala 枚举中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37901974/

相关文章:

scala - 尾递归 vs 头经典递归

scala - 如何强制 SBT 应该使用哪个 Scala 版本?

php - 无论如何有不同级别的 php 枚举?

java - 在其他 Java 类的构造函数中使用枚举

haskell - .. 在哪里定义?

c# - 在 SQL Server 中处理 'Enumerations' 有哪些不同的方法?

scala - 相当于 javascript 运算符 ||在斯卡拉

javascript - 从 Play 获取带有参数的 url

Scala案例类私有(private)构造函数不是私有(private)的

iphone - 打破照片 ALAssetsLibrary 的迭代