сопоставление шаблонов по ряду значений в scala
-
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
}
Не связан с StackOverflow