是否可以扩展Scala枚举值类型?

时间:2013-12-09 12:29:56

标签: scala enumeration

如果有可能以某种方式扩展Scala枚举值类型,那将是一种很好的结果。我的意思是这样的:

[例子只是伪代码!]

object SomeSubEnum extends Enumeration {
  type SomeSubEnum = Value

  val SubA, SubB, SubC = Value
}

object SomeTopEnum extends Enumeration {
  type SomeTopEnum = Value

  val TopA = Value("TopA", Subs = List(SomeSubEnum.SubA, SomeSubEnum.SubB))
  val TopB = Value("TopB", Subs = List(SomeSubEnum.SubC))
  val TopC = Value("TopC", Subs = List(SomeSubEnum.SubA, SomeSubEnum.SubB, SomeSubEnum.SubC))
}


用法:

def doSomething(param: SomeTopEnum) = {
  someTopEnum.Subs.forAll(sub => doMore(sub))
}


doSomethingElse(SomeTopEnum.TopA.Subs.SubB) // Subs could be a map


我是Scala的新手,在其他语言中我会创建一种静态类树结构来做到这一点,但也许在Scala中有更好的解决方案。

[抱歉我的英语不好]

1 个答案:

答案 0 :(得分:1)

您可以使用案例类吗? Scala中的枚举类型通常不是那么有用的IMO。沿着(在我的头顶上)的某些东西:

sealed abstract class MyEnum[A]
case class SubEnum[A](value : A) extends MyEnum[A]
case class TopEnum[A](value : A, subs : List[SubEnum[A]]) extends MyEnum[A]

这将允许您执行以下操作:

val top = TopEnum("top value", List(SubEnum("sub value 1"), SubEnum("sub value 2")))

然后:

top.subs map (println(_))

或:

for(s <- top.subs) println(s.value)

或者您可能想要做的任何模式匹配。如果要限制类型参数(A)的类型,则可以定义顶级案例类,所有子类必须是以下子类型:

sealed abstract class EnumValue(a : String)
case class EnumValue1 extends EnumValue("value 1")
case class EnumValue2 extends EnumValue("value 2")

...etc....

sealed abstract class MyEnum[A <: EnumValue]
case class SubEnum[A <: EnumValue](value : A) extends MyEnum[A]
case class TopEnum[A <: EnumValue](value : A, List[SubEnum[A]]) extends MyEnum[A]

比特冗长,但可能会做你想要的......

希望这有帮助