如果有可能以某种方式扩展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中有更好的解决方案。
[抱歉我的英语不好]
答案 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]
比特冗长,但可能会做你想要的......
希望这有帮助