2013-12-09 53 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 –