сопоставление шаблонов по ряду значений в scala

StackOverflow https://stackoverflow.com/questions/1806162

  •  05-07-2019
  •  | 
  •  

Вопрос

Я новичок в 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
 }

...

Это было полезно?

Решение

Я предполагаю, что ваша проблема в том, что вы хотите иметь возможность корректировать соответствие карте, которую вы получаете от 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