2016-11-18 52 views
0

以下是我有:展開值的列表爲個案

sealed abstract class Codes(list: List[String]) 
object UVWCodes extends Codes(List("U", "V", "W")) 
object XYZCodes extends Codes(List("X", "Y", "Z")) 

我想用宏展開所列數值爲:

parse(str: String): Codes = str match { 
    case "U" | "V" | "W" => UVWCodes 
    case "X" | "Y" | "Z" => XYZCodes 
} 

由於代碼是一個密封類,它是可能獲得其子類的列表。但是,如何提取代碼文字列表(「U」,「V」等)?

回答

1

當你寫

sealed abstract class Codes(list: List[String]) 

名單只是一個構造函數的參數這是失去如果不使用。如果用關鍵詞前綴VAL成爲不可改變的屬性,以便您可以訪問外

sealed abstract class Codes(val list: List[String]) 

UVWCodes.list // Valid code 
1

與@ Edmondo1984決定性的貢獻和片段從其他地方,這裏是一個完全編碼的解決方案:

import scala.reflect.runtime.universe._ 

sealed abstract class Codes(val list: List[String]) 
object UVWCodes extends Codes(List("U", "V", "W")) 
object XYZCodes extends Codes(List("X", "Y", "Z")) 


object FindObjectsByReflection { 
    def main(args: Array[String]) = { 
    val c = typeOf[Codes].typeSymbol.asClass.knownDirectSubclasses 
    c.foreach { x => 
     val d = getObjectInstance(x.fullName).asInstanceOf[Codes] 
     println(d.list) 
    } 
    } 
    def getObjectInstance(clsName: String): AnyRef = { 
    val mirror = runtimeMirror(getClass.getClassLoader) 
    val module = mirror.staticModule(clsName) 
    mirror.reflectModule(module).instance.asInstanceOf[AnyRef] 
    } 

}