当前位置: 首页 > 知识库问答 >
问题:

带构造函数和查找表的scala枚举

乐正穆冉
2023-03-14

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

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(),当一个请求进来时,我可以查找“星期一”并将其转换为我的枚举星期一并在整个软件中使用枚举。这通常是如何做到的。我看到了密封的特征,但没有看到一种方法来自动确保当有人添加扩展它的类时,它会自动添加到查找表中。有没有办法使用查找表创建一个scala枚举?

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

谢谢迪恩

共有2个答案

娄弘
2023-03-14

我看到了密封的特征,但没有看到一种方法来自动确保当有人添加扩展它的类时,它会自动添加到查找表中。有没有办法使用查找表创建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
洪英豪
2023-03-14

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

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]
  }
}

如果你没有用name覆盖,那么你会得到一种货币。值,而不是货币。CurrencyVal(当前值)。

 类似资料:
  • 我不确定我是否过度工程化了,但我正在考虑创建一个枚举,其中包含一个枚举列表作为它的值,从中我可以得到它的值。 我无法确定枚举的类型,以便正确地将值数组筛选到正确的枚举。例如,我可以用轻松地获得US枚举。我遇到的困难是从该数组中获得正确的值。我尝试比较名称,

  • 问题内容: 目前,我们的代码存在一种情况,即我们在Java层中使用枚举,该枚举通过以下构造函数存储id和“显示值”: 我们希望打字稿中的某些内容能够与之匹配,以便以有意义的方式显示状态以执行逻辑并在前端向用户显示值。这可能吗?有没有更好的方法来解决这个问题?我们希望避免使用诸如status.id()= 1或status.name()=’Active’这样的逻辑,从而推动枚举。 谢谢 问题答案: T

  • 我正在尝试实现一个链表。 列表有私有变量*头,*尾,计数。 我理解数据结构中的逻辑,但不可否认,我是C语言的新手,所以我觉得我可能没有正确地使用构造函数。 *head和*tail是列表节点指针。然后,列表节点具有指向上一个和下一个(双链接列表)的指针。 以下是我尝试过的: 我的程序可以编译,但当它试图使用此构造函数创建新列表时崩溃。有什么建议吗?

  • 我正在为即将到来的考试做一些修订,我对对象构造函数中枚举的使用有点困惑。

  • 我有一个表ROOT和一个包含与ROOT相关行的表子级。 我想为根的每一行检索一个对象,该对象包含根对象以及与CHILDREN表中的ROOT.id相关的行数。 这可以很容易地在SQL中实现,但我想知道如何在JPQL中编写 在SQL中: 知道吗?

  • 问题内容: 我开始学习JAXB,所以我的问题可能很愚蠢。现在我有了类,想要生成XML Schema。在执行此指令后,我得到了异常 IllegalAnnotationExceptions …没有无参数的默认构造函数。 是的 我的课程没有默认的无参数构造函数。太容易了 我有类与包可见的构造函数/ final方法和偏离路线的参数。我应该怎么做-创建一些特定的momemto / builder类或将我的构