2015-02-09 59 views
2

我能够循环我的枚举,当我这样做是这样的:如何循环枚举,我为每个枚举项目设置值?

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 
} 

我怎么可能通过这些值循环?

+0

你可以手动添加到收藏这个领域里面单,如果这是可取的(没有多少价值,你可以改变的源代码)。或者我在这里错过了什么? – mucaho 2015-02-10 00:29:20

回答

4

你不能,因为你没有调用Enumeration的方法Value,因此没有枚举案例正在创建。

斯卡拉Enumeration已知是坏的,我可以建议一个ADT方法吗?

sealed trait BitMask { def repr: Long } 
object BitMask { 
    case object None extends BitMask { val repr = math.pow(2, 0).toLong } 
    case object Green extends BitMask { val repr = math.pow(2, 2).toLong } 
    case object Yellow extends BitMask { val repr = math.pow(2, 3).toLong } 
    case object Black extends BitMask { val repr = math.pow(2, 4).toLong } 
    // etc 
} 

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

+0

ADT是什么意思?对不起,我错过了... – Blankman 2015-02-09 23:18:48

+0

ADT代表[代数数据类型](http://en.wikipedia.org/wiki/Algebraic_data_type)。你可以在这里阅读更多关于适用于scala枚举的这种方法:http://underscore.io/blog/posts/2014/09/03/enumerations.html – 2015-02-09 23:53:02

+0

有些人主张讨厌枚举,但“已知会被打破”只意味着“软件有错误”。它完成了它的目标,并且也涵盖了其他用例,这比大多数软件所能达到的要多。 – 2015-02-10 21:40:36

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.