我正在尋找一種在Scala中實現豐富枚舉的機制,就像你可以在Java中添加抽象方法來枚舉並在枚舉實例中實現它們一樣。Scala中豐富的枚舉
請注意,使用密封的特徵和案例對象不是一個解決方案,因爲我不能遍歷現有的案例對象,除非我維護它們的列表,這對於更改非常脆弱(尤其是其他人誰不明白髮生了什麼)
我正在尋找一種在Scala中實現豐富枚舉的機制,就像你可以在Java中添加抽象方法來枚舉並在枚舉實例中實現它們一樣。Scala中豐富的枚舉
請注意,使用密封的特徵和案例對象不是一個解決方案,因爲我不能遍歷現有的案例對象,除非我維護它們的列表,這對於更改非常脆弱(尤其是其他人誰不明白髮生了什麼)
只是擴展Val
。
object items extends Enumeration {
val pen = Item("writing")
val brush = Item("painting")
final case class Item(key: String) extends Val {
def kind: String = toString
}
}
object Test {
import items._
def main(args: Array[String]) {
println(pen.kind +" is for "+ pen.key)
println(brush.key)
println(items.values)
}
}
或
object days extends Enumeration {
case class Day(i: Int, name: String) extends Val(i, name) {
def isWeekDay = i < 5
}
private def newDay() = new Day(nextId, null)
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = newDay()
val daysOfTheWeek = values.toList.asInstanceOf[List[Day]]
}
object Test extends App {
import days._
println(Thu)
println(days.values.toList mkString ",")
for (d <- days.daysOfTheWeek) Console println s"$d is weekday? ${d.isWeekDay}"
}
檢查亦是巴生維克多這裏建議:https://gist.github.com/viktorklang/1057513
這是構建一個枚舉一個非常安全的方式。
我剛剛嘗試在此URL中使用Klang的代碼。我無法讓它工作。我繼續收到「警告:比賽並不詳盡!」。 Scala編譯器中的某些東西在他使用的版本(2011年中)和現在(2014年中)之間發生了變化? – chaotic3quilibrium
>「除非我維護它們的列表」不能由宏生成嗎? –
也許,但我沒有使用宏的經驗。我將不得不檢查我的特徵的所有子類,它們是個案對象......任何提示? – Edmondo1984
不幸的是,我也是。但看到解決方案會很有趣。 另外,您可以嘗試在運行時用反射來構造列表,因爲它只執行一次,所以只會造成很小的懲罰。 –