scala - 为什么 Scala 有一个 case 对象?

标签 scala

它不能用 params 初始化,它只会与自身进行比较(单例)。所以它的equals和hash code函数没有优势。有没有人遇到过他们觉得有用的案例?

最佳答案

您可以使用 case 对象作为枚举的替代方法。

详情请见:Case objects vs Enumerations in Scala

该问题的一个简化示例:

sealed trait Currency {
  def name: String
  def symbol: String
}

case object EUR extends Currency {
  val name = "EUR"
  val symbol = "€"
}

case object USD extends Currency {
  val name = "USD"
  val symbol = "$"
}

好处
  • 这样可以有更多的字段(与 Enumeration 中的 ID 和名称相比)
  • 如果匹配不是详尽的,编译器会发出警告(在 sealed 类型层次结构的情况下)。

  • 所以这段代码

    val ccy: Currency = EUR
    ccy match {
      case EUR =>
        println("Euro")
    }
    

    会导致

    Warning:(27, 7) match may not be exhaustive.
    It would fail on the following inputs: USD
    ccy match {



    缺点
  • 没有“按名称获取”方法( Enumeration 提供 withName() )
  • 您不能迭代“所有”元素
  • 关于scala - 为什么 Scala 有一个 case 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32602356/

    相关文章:

    scala - 动态类型和编程分布式系统

    Scala - 展平树结构

    java - 在 Intellij IDEA 13 中玩框架 2 运行单元测试

    scala - 替换不推荐使用的<:< Manifest type witness in Scala 2. 10

    java - play2 在子模块/子项目中使用主项目 View / Controller /模型,反之亦然

    scala - 如何在 SBT 0.10 中声明项目依赖?

    performance - Scala 惰性值 : performance penalty? 线程安全?

    scala - 何时使用 Scala Vector,何时使用 Scala Array?

    scala - 为多项目 build.sbt 中的一个项目运行自定义 sbt 插件任务

    java - 如何排除 cucumber 标签