scala使用构造函数和查找表进行枚举

时间:2014-10-21 17:43:12

标签: scala scala-2.10

我在某个地方看到了以下解决方案

object Day {
  val values = new ArrayBuffer[Day]
  case class Day(name:String) {
    values += this
  }
  val MONDAY = new Day("monday")
  val TUESDAY = new Day("tuesday")
}

这展示了我想要去做的事情除了在ArrayBuffer中隐藏了一个var ....这有点icky。

我真正想要的是val lookupTable = Map(),当请求进来时,我可以查找“星期一”并将其翻译成我的枚举星期一并在整个软件中使用枚举。这通常是怎么做的。我看到了密封的特性,但没有看到一种方法来自动确保当有人添加一个扩展它的类时,它会自动添加到查找表中。有没有办法用查找表创建scala枚举?

scala Enumeration似乎很接近,因为它有一个values()方法,但是我没有看到如何传入表示我们从用户那里收到的日期的字符串,然后将其转换为枚举。

感谢, 迪安

2 个答案:

答案 0 :(得分:1)

更新以向您展示如何重命名枚举值,添加其他构造函数参数以及如何向枚举中添加其他方法。

object Currency extends Enumeration {

  sealed case class CurrencyVal(name: String, value: Int) extends Val(name) {
    def *(n: Int): Int = n * value
  }

  val PENNY   = CurrencyVal("penny", 1)
  val NICKLE  = CurrencyVal("nickle", 5)
  val DIME    = CurrencyVal("dime", 10)
  val QUARTER = CurrencyVal("quarter", 25)

  override def withName(name: String): CurrencyVal = {
    super.withName(name).asInstanceOf[CurrencyVal]
  }
}

如果您不覆盖withName,那么您将获得Currency.Value而不是Currency.CurrencyVal

答案 1 :(得分:0)

  

我看到了密封的特征,但没有看到自动确定的方法   当有人添加一个扩展它的类时,它会   自动添加到查找表中。有没有办法创建一个   带有查找表的scala枚举

我在这里制作了一个可能有用的小型库,名为Enumeratum。其用法如下:

some_func