2012-11-01 39 views
1

我有一個密封的案例類三重奏。斯卡拉會告訴我,如果這場比賽是詳盡的(我猜不是)?窮舉模式匹配僅基於類型

value match { 
    case a: A => methodThatNeedsA(a) 
    case b: B => methodThatNeedsB(b) 
    case c: C => methodThatNeedsC(c) 
} 

我可以做到以下幾點,我的理解將是詳盡的 - 但因爲我並不需要分解的表達,它看起來很凌亂:

value match { 
    case a @ A(_) => methodThatNeedsA(a) 
    case b @ B(_, _) => methodThatNeedsB(b) 
    case c @ C(_, _, _) => methodThatNeedsC(c) 
} 

有沒有更好的辦法像這樣基於純粹的類型調度?

回答

4

我只是測試你的代碼:

sealed trait Base 
case class A(x: Int) extends Base 
case class B(x: Int, y: Int) extends Base 
case class C(x: Int, y: Int, z: Int) extends Base 

如果我刪除的任何三個case S的模式匹配:

value match { 
    case a: A => methodThatNeedsA(a) 
    case b: B => methodThatNeedsB(b) 
    //case c: C => methodThatNeedsC(c) 

} 

編譯器會發出警告:

warning: match is not exhaustive! 
missing combination    C 
+0

哇,好吧 - 我只是假定它無法檢查,因爲它涉及動態投射!愚蠢的假設。謝謝! –