2015-02-09 61 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.