2013-01-07 24 views
1

如果有人希望對整個Map對象應用模式匹配,那麼情況如何?爲什麼不能將不可變的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的稀有用法(通常是無意義的)?
+5

由於Map默認是無序的,因此您的模式匹配可能偶爾會失敗,並且沒有明顯的原因:假設您正在查找Map2(「a」 - > 1,「b」 - > 2),而地圖將按照地圖( 「b」 - > 2 「」 - > 1)。 –

+1

我實際上找到了一種方法來實現這一點,但解決方案有點瘋狂。只要看看「參數化提取器」部分:http://hacking-scala.posterous.com/introduction-to-type-dynamic – tenshi

回答

3

一個突出的原因是,從案例類派生新類至多被棄用,在最壞情況下是危險的。爲了允許用戶(或Scala標準庫作者)從這些類派生,它們可能不是案例類。

相關問題