문제

나는 스칼라 초보자 이고이 코드는 나를 어려움으로 만듭니다.

내가 데이터에 전달하는 모든 것이 올바른 유형인지 확인하기 위해 패턴 일치를 수행하는 방법이 있습니까? 보시다시피 나는 매우 이상한 데이터 유형이 있습니다 ...

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(), 그러나지도에는 없습니다 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
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top