我正在尝试在Scala中实现Rich枚举,我的枚举也必须实现例如特征。
这很好,但是当我尝试迭代枚举时,Enumeration.values返回一个ValueSet,它是Enumeration.Value的集合
是否有一种简单的方法可以实现此功能,而无需使用宏,并且Travis Brown建议使用密封特性Iteration over a sealed trait in Scala??
答案 0 :(得分:3)
使用Enumeration类可以相对轻松地完成scala中的枚举。下面是一个例子。
trait Num {
def echo
}
object Status extends Enumeration {
case class StatusVal(code: Int, name: String) extends Val with Num {
override def echo {
println("Number: " + name)
}
}
val ONE = StatusVal(1, "One")
val TWO = StatusVal(2, "Two")
val THREE = StatusVal(2, "Three")
}
Status.values foreach (s => s.asInstanceOf[Num].echo)
答案 1 :(得分:1)
您是否尝试过隐式转换?记得保持范围紧张:
// I have deliberated stolen @cyrillk example :).
// Just add this line to the body os Status (Enumeration Object)
implicit def valueToNum(v: Value): Num = v.asInstanceOf[Num]
Value
将隐式转换为Num
,因此:
Status.values foreach (s => s.echo) // works!
答案 2 :(得分:1)
您可能必须先转换:
Enumeration and mapping with Scala 2.10
我猜两个答案都有关系,但我完全忘记了我的答案。
这个帖子
https://groups.google.com/d/msg/scala-internals/8RWkccSRBxQ/snNuzjJakhkJ
可能标志着更换枚举的漫长道路的开始。它包含一些关于使用的不同(双关语警示)意见。
早点停在路上: