Scala 为什么不';定义为案例类的不可变映射具体类?

Scala 为什么不';定义为案例类的不可变映射具体类?,scala,map,pattern-matching,Scala,Map,Pattern Matching,如果有人想在整个映射对象上应用模式匹配,该怎么办 例如(虽然不是编译): 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 cod

如果有人想在整个
映射
对象上应用模式匹配,该怎么办

例如(虽然不是编译):

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
定义为案例类

  • 防止内部字段封装的案例类?(如
    key1
    value1
    …)
  • Case类不适用于泛型类型参数
  • 很少使用匹配整个地图(通常没有意义)

一个显著的原因是,从case类派生新类最好是不推荐的,最坏是危险的。为了允许用户(或Scala标准库作者)从这些类派生,它们可能不是case类。

因为Map在默认情况下是无序的,因此您的模式匹配有时可能会在没有明显原因的情况下失败:假设您正在查找Map2(“a”->1,“b”->2),而Map将按Map(“b”->2,“a”->1)排序.我实际上找到了一种方法来实现这一点,但这个解决方案有点疯狂。请看“参数化提取器”一节: