如何循环枚举,我为每个枚举项设置值?

时间:2015-02-09 19:56:16

标签: scala

当我这样做时,我能够循环我的枚举:

object Colors extends Enumeration {
  type Colors = Value
  val Red, Green, Blue, Yellow = Value
}

for(e <- Colors.values) { ... }

所以我很容易创建一个下拉列表等。

现在我的枚举存储了比特值,如:

object BitMask1 extends Enumeration {
  val none = math.pow(2,0).toLong
  val Green = math.pow(2,2).toLong
  val Yellow = math.pow(2,3).toLong
  val Black = math.pow(2,4).toLong
  // etc
}

我怎么可能循环这些值?

2 个答案:

答案 0 :(得分:4)

您不能,因为您没有调用Value的{​​{1}}方法,因此没有创建枚举案例。

已知Scala Enumeration已被破坏,我可以建议使用ADT方法吗?

Enumeration

然后你可以use a macro to enumerate the values

答案 1 :(得分:0)

Enumeration可以通过不同的方式满足您的需求。

这是一个:

scala> object Colors extends Enumeration { val None, Blue, Green, Yellow = Value }
defined object Colors

scala> import Colors._
import Colors._

scala> Blue.id
res0: Int = 1

scala> Yellow.id
res1: Int = 3

scala> object Colors extends Enumeration {
     |   val None, Blue, Green, Yellow = Value
     |   implicit class `color mask`(val v: Value) extends AnyVal {
     |     def mask = 1L << v.id
     |   }
     |   implicit class `colors mask`(val vs: ValueSet) extends AnyVal {
     |     def mask = vs.toBitMask(0)
     |   }
     | }
defined object Colors

scala> import Colors._
import Colors._

scala> Blue.mask
res2: Long = 2

scala> Yellow.mask
res3: Long = 8

scala> (Blue + Yellow).mask
res4: Long = 10

scala> for (v <- Colors.values) yield v.mask
res5: scala.collection.immutable.SortedSet[Long] = TreeSet(1, 2, 4, 8)

Other ideas.