2010-10-25 67 views
7

我想利用Scala在缺少匹配時發出的警告(「不完全」) - 以便我不會忘記一個(我有幾十個)。以下簡化示例顯示了我的嘗試:斯卡拉模式匹配繼續說「比賽並不全面!」

sealed case class MESSAGE() 
class SUCCESS_MESSAGE extends MESSAGE 
class FAILURE_MESSAGE extends MESSAGE 

def log(str: String, msgType: MESSAGE) { 
    msgType match { 
     case t:SUCCESS_MESSAGE => println("FAILURE: " + str) 
     case t:FAILURE_MESSAGE => println("SUCCESS: " + str) 
    } 
} 

問題是它說「匹配不完全!」儘管列出了所有可能的組合。如果我把「案_ =>」,在那裏,警告整點無效適合我,因爲我可以添加

class INFO_MESSAGE extends MESSAGE 

,並會發出警告。

有沒有解決方案?

+6

SUCCESS_MESSAGE應打印出 「失敗」,你肯定嗎? – 2010-10-25 14:05:10

+2

我強烈建議不要在任何情況下擴大案例分類。只是FYI。 – jsuereth 2010-10-25 14:31:57

回答

32

理想情況下,你不應該擴展具體的類,特別是不是案例類!

鑑於沒有可能自定義SUCCESS_MESSAGEFAILURE_MESSAGE,您可能還想製作這些單身人士。

最後,下劃線是Scala變量或類名中的Bad Thing(tm)。所有大寫字母的名字都不是慣用的。所以:

sealed trait Message 
case object SuccessMessage extends Message 
case object FailureMessage extends Message 

def log(str: String, msgType: Message) = msgType match { 
    case SuccessMessage => println("Success: " + str) 
    case FailureMessage => println("Failure: " + str) 
} 

另外,我推薦這個,你可以用實際的消息字符串:

sealed trait Message { def msg: String } 
case class Success(msg:String) extends Message 
case class Failure(msg:String) extends Message 

def log(msg: Message) = msg match { 
    case Success(str) => println("Success: " + str) 
    case Failure(str) => println("Failure: " + str) 
} 
+0

s/in Scala變量名稱/ Scala中的類名稱/ – 2010-10-25 14:46:41

+0

變量或類名稱,如果你想精確:) – 2010-10-25 14:49:48

+2

第一個例子仍然存在同樣的問題,因爲'Message'沒有標記爲'abstract'。第二個例子是可以的,因爲抽象方法'msg'保證'Message'也是抽象的。 – 2010-10-25 21:23:45

27

您錯過了一種情況:該消息可能是MESSAGE的一個實例,不是它的一個子類。

如果你想使這種情況變得不可能,你需要製作MESSAGE抽象。這將使警告消失。