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

标签 scala pattern-matching

我是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
 }

...

最佳答案

我想您的问题是您希望能够对从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
}

关于scala - 在scala中对一系列值进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806162/

相关文章:

pattern-matching - 数值模式匹配

scala - Trees$Literal(反射)在 Scala 2.13.0-M3 中移动了吗?

scala - 用户包含 scalamacros paradise 的最简单方法

android - 如何从单个字符串中获取多个匹配的模式

Scala 案例类和尾递归最佳实践

javascript - 表达式模式匹配

scala - ElasticSearch导入问题

Scala 条件累加

scala - 重试功能,无需递归

string - 字符串匹配的随机算法