【问题标题】:getting Value from scala enumeration从scala枚举中获取价值
【发布时间】:2016-06-18 21:52:05
【问题描述】:

说我有这样的枚举

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 的值。

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

【问题讨论】:

    标签: scala enumeration


    【解决方案1】:

    可以,使用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]。您可以在我之前链接的文档中进行验证。

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

    【讨论】:

    • 是的,我知道 .id 方法,但在这里不可用。我在我的问题中附上了一张照片。
    • 查看我的编辑。你以错误的方式使用你的枚举。
    • 请注意,Enumeration#Value 已经实现了 Ordered[Value]。您可以在我之前链接的文档中验证它。 - 是的,但在我的情况下比较更复杂。谢谢,这正是我想要的。
    • 值可以定义为字符串。这种情况似乎与 .id() 不兼容。
    • @AndrewNorman 值的 id 仍然是 Int,即使它们被定义为字符串。无论如何,每个场景都可以以某种方式处理,只有了解枚举在 scala 中是如何工作的很重要。无论如何,我的回答帮助了 OP,这是正确的,我认为没有理由不投票......
    【解决方案2】:

    问题已经得到解答,但我的方法如下:

    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)
        }
    }
    

    【讨论】:

    • 如果您意识到问题已经得到解答,是什么让您添加了自己的问题,除了重命名之外没有什么新东西。
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 2013-04-07
    • 1970-01-01
    • 2017-11-07
    • 2012-12-28
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多