定义具有2个属性的scala枚举

时间:2016-02-23 19:49:22

标签: scala enums

我想要创建枚举的几个字段,但这些字段有两个值:ValidNot valid

object MyEnum extends Enumeration
{
    val
    type1, // this type is valid
    type2, // valid
    type3, // valid
    type4, // Not valid
    type5, // Not valid
    type6, // Not valid
    type7  // Not valid 
    = value
}

有关如何通过代码区分ValidNot valid的任何建议吗?或者它必须分成2个枚举?

2 个答案:

答案 0 :(得分:0)

您可以使用不同的模式,但不会扩展Enumeration但行为类似:

object MyEnum extends Serializable {
  abstract sealed class MyEnum(
    val ordinal: Int, val isValid: Boolean
  ) extends Ordered[MyEnum] with Serializable {
    def compare(that: MyEnum) = that.ordinal compare this.ordinal

    def toInt: Int = this.ordinal
  }

  case object Type1 extends MyEnum(0, true)
  case object Type2 extends MyEnum(1, true)
  case object Type3 extends MyEnum(2, true)
  case object Type4 extends MyEnum(3, false)
  case object Type5 extends MyEnum(4, false)
  case object Type6 extends MyEnum(5, false)
  case object Type7 extends MyEnum(6, false)

  def fromInt(i: Int): MyEnum = values.find(_.ordinal == i).get

  val values = Set(
    Type1, Type2, Type3, Type4, Type5, Type6, Type7
  )
}

通过这种方式,您可以使用类似于上述示例的val myEnum: MyEnum.MyEnum = MyEnum.Type1进行分配,并且您可以访问myEnum.isValid。同样,您可以使用fromInt方法通常访问它。例如MyEnum.fromInt(0).isValid。如果您提供更多关于您尝试使用这些值的内容,我可以提供更好的解决方案。希望这会有所帮助。

答案 1 :(得分:0)

您可以在Enum对象上创建一个函数,并使用Enumeration.Value的.toString部分

object MyEnum extends Enumeration {

    val type1 = Value("valid")
    val type2 = Value("valid")
    val type3 = Value("valid")
    val type4 = Value("Not valid")
    val type5 = Value("Not valid")
    val type6 = Value("Not valid")
    val type7 = Value("Not valid")

    lazy val lookup = this.values.map { n => (n, n.toString == "valid") }.toMap

    def isValid(myEnum: MyEnum.Value) =  lookup.getOrElse(myEnum, false)
}

MyEnum.isValid(MyEnum.type1)                      //> res0: Boolean = true
MyEnum.isValid(MyEnum.type7)                      //> res1: Boolean = false

来源: https://github.com/scala/scala/blob/v2.11.7/src/library/scala/Enumeration.scala#L146 http://www.scala-lang.org/api/current/#scala.Enumeration $值