【问题标题】:Why aren't immutable Map concrete classes defined as case classes?为什么不将不可变 Map 具体类定义为案例类?
【发布时间】:2012-12-21 12:43:42
【问题描述】:

如果有人想对整个 Map 对象应用模式匹配,那该怎么办?

示例(虽然没有编译)是:

def main(args: Array[String]) {
    val m: Map[String, Int] = Map("a" -> 1, "b" -> 2) //scala.collection.immutable.Map2
    m match {
      case Map2("a",1,"b",2)  => println("matched")   //conceptual code line 
      case _ => println("not matched")
    }
}

阻止Map2 定义为案例类的可能原因有哪些?

  • 防止封装内部字段的案例类? (比如key1value1...)
  • 案例类不适用于泛型类型参数?
  • 很少使用匹配整个地图(通常是无意义的)?

【问题讨论】:

  • 因为 Map 在默认情况下是无序的,因此您的模式匹配可能偶尔会在没有明显原因的情况下失败:假设您正在寻找 Map2("a"->1,"b"->2) 而地图将按 Map("b"->2,"a"->1) 排序。
  • 我实际上找到了一种方法来实现这一点,但解决方案有点疯狂。只需查看“参数化提取器”部分:hacking-scala.posterous.com/introduction-to-type-dynamic

标签: scala map pattern-matching


【解决方案1】:

一个突出的原因是从案例类派生新类充其量是不推荐使用的,最坏的情况是危险的。为了允许用户(或 Scala 标准库作者)从这些类派生,它们可能不是案例类。

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2011-05-03
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多