在Scala中对一系列值进行模式匹配

3

我是Scala的初学者,这段代码让我很困惑。

有没有一种方法可以进行模式匹配,以确保我传递给Data的所有内容都是正确的类型?正如你所看到的,我的数据类型相当奇怪...

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个回答

1

我猜你的问题是想要匹配从parseFull()获取的Map,但Map没有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
}

谢谢您的回答,但实际上它并不起作用。我不确定我是否做得对,但在使用ant编译时,两种情况下都会出现以下错误: 错误:模式类型与预期类型不兼容; [scalac] found : String [scalac] required: Option[Any] [scalac] case s: String => Some(s) 停止字符串,映射似乎没问题... - flagZ
将每个值用Some包装可以解决这个问题。 case(Some(templateText: String), Some(...)) 感谢您的开始。 - flagZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接