2013-12-09 55 views
0

如果可以通过某种方式扩展Scala枚举值类型,那将会很好,即一种树结构会产生。我的意思是类似的东西:[!例子仅仅是伪代码]

是否可以扩展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中有更好的解决方案。

回答

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) 

或者任何与你匹配的模式可能w蚂蚁也是如此。如果你想限制类型的类型参数(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] 

有点冗长,但可能会做你想要什么...

希望这有助于

+0

其实,给你一个更灵活的结构,你可以简单地只是改变TopEnum的定义:案例类TopEnum [A <:EnumValue](价值:A,列表[ MyEnum [A]])扩展了MyEnum [A]。这样,你可以有一个混合的TopEnums和SubEnums列表... –

+0

对于一个漂亮的包中的其他Java枚举类似的功能。看到这个家伙发布http://stackoverflow.com/a/27441788/1148030 –