2009-11-26 71 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