从 Scala 枚举中获取值
getting Value from scala enumeration
说我有这样的枚举
object SimpleEnum extends Enumeration{
val ONE = Value(1)
val TWO = Value(2)
val THREE = Value(3)
etc...
}
我还有一个 class 我想扩展 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 的值。
在 java 中,我能够在枚举上声明一个变量,并通过这个 var 访问对应于它的实际值,在 scala 中,我正在寻找一种方法来获取枚举的实例并达到出其价值。
可以,使用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
能够包装您的枚举值。这些值的类型(即 ONE
、TWO
、THREE
)不是 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]
。您可以在我之前链接的文档中验证它。
scala 中没有 classic java enum
,但是因为这门语言太酷了,所以可以创建一个名为 Enumeration
通过一些技巧可以实现类似的行为。
问题已经回答了,但我的做法是:
object SimpleEnum extends Enumeration{
type SimpleEnum = Value
val ONE = Value(1)
val TWO = Value(2)
val THREE = Value(3)
etc...
}
class SimpleClass(val i : Int){
def getNumber() {
import SimpleEnum._
SimpleEnum(i)
}
}
说我有这样的枚举
object SimpleEnum extends Enumeration{
val ONE = Value(1)
val TWO = Value(2)
val THREE = Value(3)
etc...
}
我还有一个 class 我想扩展 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 的值。
在 java 中,我能够在枚举上声明一个变量,并通过这个 var 访问对应于它的实际值,在 scala 中,我正在寻找一种方法来获取枚举的实例并达到出其价值。
可以,使用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
能够包装您的枚举值。这些值的类型(即 ONE
、TWO
、THREE
)不是 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]
。您可以在我之前链接的文档中验证它。
scala 中没有 classic java enum
,但是因为这门语言太酷了,所以可以创建一个名为 Enumeration
通过一些技巧可以实现类似的行为。
问题已经回答了,但我的做法是:
object SimpleEnum extends Enumeration{
type SimpleEnum = Value
val ONE = Value(1)
val TWO = Value(2)
val THREE = Value(3)
etc...
}
class SimpleClass(val i : Int){
def getNumber() {
import SimpleEnum._
SimpleEnum(i)
}
}