【问题标题】:scala Enumeration with constructor and lookup table带有构造函数和查找表的scala枚举
【发布时间】:2014-10-21 17:43:11
【问题描述】:

我在某处看到了以下枚举解决方案

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 ......这有点恶心。

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

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

谢谢, 院长

【问题讨论】:

标签: scala scala-2.10


【解决方案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

【讨论】:

  • 我更想要一个代码到枚举映射。在这种情况下,如果有人将 Mon 重命名为 Mon2,它会中断(在这个工作日的情况下不太可能,但在其他情况下可能会发生,您希望更清楚地使用像 Monday 而不是 Mon 这样的名称)。此外,枚举有时包含多个参数,例如整数代码、toString 版本,有时可能还有一件事。
【解决方案2】:

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

我在这里创建了一个可能有帮助的小库,名为 Enumeratum。其用法如下:

import enumeratum._

// entryName is for serdes, customise it as you'd like
sealed abstract class Day(val entryName: String) extends EnumEntry

case object Day extends Enum[Day] {

   // This will add Day entries declared below into a map at compile time, automagically
  val values = findValues

  case object MONDAY extends Day("monday")
  case object TUESDAY extends Day("tuesday")
  // etc
}

Day.withName("monday") // => returns MONDAY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多