2009-11-26 24 views
3

我是一名Scala初學者,這段代碼讓我很困惑。在scala中對一系列值進行模式匹配

有沒有辦法做模式匹配,以確保我傳遞給數據的所有內容都是正確的類型?正如你可以看到我有很奇怪的數據類型...

class Data (
val recipient: String, 
val templateText: String, 
val templateHtml: String, 
val blockMaps: Map[String,List[Map[String,String]]], 
templateMap: Map[String,String] 
) 

...

val dataParsed = JSON.parseFull(message) 
dataParsed match { 
case dataParsed: Map[String, Any] => { 
    def e(s: String) = dataParsed get s 
    val templateText = e("template-text") 
    val templateHtml = e("template-html") 
    val recipient = e("email") 
    val templateMap = e("data") 
    val blockMaps = e("blkdata") 

    val dependencies = new Data(recipient, templateText, templateHtml, blockMaps, templateMap) 
    Core.inject ! dependencies 
} 

...

回答

1

我猜你的問題是要能夠彭定康匹配您從parseFull()獲得的地圖,但地圖沒有unapply

所以,你可以模式匹配每一個值,提供一個默認的,如果它是類型不正確:

val templateText: Option[String] = e("template-text") match { 
    case s: String => Some(s) 
    case _ => None 
} 

或暫時把所有的數據到一些結構,可以是模式匹配:

val data = (e("template-text"), e("template-html"), e("email"), e("data"), 
      e("blkdata")) 

val dependencies: Option[Data] = data match { 
    case (templateText: String, 
     templateHtml: String, 
     blockMaps: Map[String,List[Map[String,String]]], 
     templateMap: Map[String,String]) => 
    Some(new Data(recipient, templateText, templateHtml, blockMaps, templateMap)) 
    case _ => None 
} 
+0

謝謝你的回答,但它實際上不起作用。我不確定我在做什麼,但是在使用ant進行編譯時,我遇到了這個錯誤。 錯誤:模式類型與預期類型不兼容; [scalac]實測值:字符串 [scalac]需要:選項[任意] [scalac] \t \t \t \t如果s:字符串=>一些(一個或多個) 停止向串,地圖似乎是細.. – flagZ 2009-11-27 19:25:18

+0

包裹每個值與Some解決了這個問題。 case(一些(templateText:String),一些(...)) 感謝開始壽 – flagZ 2009-12-03 14:32:51