我正在寻找一种在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
不幸的是,我也是。但看到解决方案会很有趣。 另外,您可以尝试在运行时用反射来构造列表,因为它只执行一次,所以只会造成很小的惩罚。 –